17

私は今このシナリオにいます: コレクション 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 を String に変換する方法はありますか?

編集

この質問は関連していますが、解決策は私の問題に適合しません。(特に、集計中に ObjectId.toString() を使用できないため)

実際、Mongo のドキュメントで ObjectId().toString() 操作を見つけることができませんでしたが、この場合に実行できるトリッキーなことはあるのでしょうか。

4

5 に答える 5

10

これで、単純に ObjectId を文字列に変換する集計を試すことができます $toString

db.collection.aggregate([
    { "$addFields": {
        "userRef": { "$toString": "$userRef" }
    }},
    { "$group": {
      "_id": { "$concat": ["$userRef", "-", "$serialNumber"] }
    }}
])

ここで出力を確認できます

于 2018-07-08T11:03:38.427 に答える
6

やりたいことを実行する方法が見つからなかったので、代わりに 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'
    }
);
于 2016-06-21T15:49:24.970 に答える
-2

$substr https://docs.mongodb.com/manual/reference/operator/aggregation/substr/#exp._S_substrを使用して、 の前に任意のオブジェクトを文字列にキャストできます$concat

これは私のために働いているコードのサンプルです。

group_id_i['_id'] = {
    '$concat' => [
        { '$substr' => [ {'$year' => '$t'}, 0, -1] }, '-',
        { '$substr' => [ {'$month' => '$t'}, 0, -1] }, '-',
        { '$substr' => [ {'$dayOfMonth' => '$t'}, 0, -1] }
    ]
} 

DateTime フィールドはどこですかt。この集計は次のようなデータを返します。

{
    "_id" => "28-9-2016",
    "i" => 2
}
于 2016-10-04T19:41:56.320 に答える