私は今このシナリオにいます:私はコレクションXを持っています:
{
_id:ObjectId('56edbb4d5f084a51131dd4c6'),
userRef:ObjectId('56edbb4d5f084a51131dd4c6'),
serialNumber:'A123123',
...
}
すべてのドキュメントを集計し、userRef + serialNumberでグループ化する必要があるため、次のようにconcatを使用しようとしています。
$group: {
_id: {
'$concat': ['$userRef','-','$serialNumber']
},
...
したがって、基本的にMongoDBでの集計では、ObjectIdと文字列を連結してドキュメントをグループ化する必要があります。ただし、$ concatはパラメータとして文字列のみを受け入れるようです。
uncaught exception: aggregate failed: {
"errmsg" : "exception: $concat only supports strings, not OID",
"code" : 16702,
"ok" : 0
}
集計式内でObjectIdを文字列に変換する方法はありますか?
[〜#〜]編集[〜#〜]:
これ 質問 は関連していますが、私は解決策が私の問題に適合しません。 (特に、集計中にObjectId.toString()を使用できないため)
確かに、MongoのドキュメントでObjectId()。toString()操作を見つけることができませんでしたが、この場合に実行できるトリッキーなことがあるかどうか疑問に思います。
やりたいことをする方法が見つからなかったので、代わりにMapReduce関数を作成しました。この関数は、最終的に、希望どおりにキーを生成しました(他のキーを連結します)。
最後に、それは次のようになりました:
db.collection('myCollection').mapReduce(
function() {
emit(
this.userRef.str + '-' + this.serialNumber , {
count: 1,
whateverValue1:this.value1,
whateverValue2:this.value2,
...
}
)
},
function(key, values) {
var reduce = {}
.... my reduce function....
return reduce
}, {
query: {
...filters_here....
},
out: 'name_of_output_collection'
}
);
両方のフィールドを含む配列を使用して解決しようと思うかもしれません。
{$project:{newkey:['$userRef','$serialNumber']},{$match:{newkey:{$in:filterArray}}}}
これにより、両方のフィールドのデータがフィルターに一致する場合があります。 newkey配列のデータは、filterArray要素と同じデータ型である必要があることに注意してください。
$ toStringを使用すると、次の方法でObjectIDの集計に$ concatを適用できます-
$group: {
'_id': {
'$concat': [
{ '$toString' : '$userRef' },
'-',
{ '$toString' : '$serialNumber'}
]
},
}