web-dev-qa-db-ja.com

mongoAggregationでObjectIDをStringに変換します

私は今このシナリオにいます:私はコレクション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()操作を見つけることができませんでしたが、この場合に実行できるトリッキーなことがあるかどうか疑問に思います。

16
André Perazzi

やりたいことをする方法が見つからなかったので、代わりに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'
    }
);
6
André Perazzi

これで、 $toString ObjectIdを文字列に変換するだけの集計を試すことができます。

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

出力を確認できます ここ

3
Ashh

両方のフィールドを含む配列を使用して解決しようと思うかもしれません。

{$project:{newkey:['$userRef','$serialNumber']},{$match:{newkey:{$in:filterArray}}}}

これにより、両方のフィールドのデータがフィルターに一致する場合があります。 newkey配列のデータは、filterArray要素と同じデータ型である必要があることに注意してください。

0
John.H

$ toStringを使用すると、次の方法でObjectIDの集計に$ concatを適用できます-

$group: {
    '_id': {
        '$concat': [
            { '$toString' : '$userRef' },
            '-',
            { '$toString' : '$serialNumber'}
        ]
    },
}
0