0

私は次のものを持っているとしましょう:

this.aggregate(
    {$unwind: "$tags"},
    {$match: {tags: {$in: pip.activity.tags}}},
    {$group : {_id : '$_id',matches:{$sum:1}}},
    {$project: { _id: 0,matches:1}},
    {$sort: {matches:-1 }},
    callback
);

結果に「外部」objectId フィールドを追加するにはどうすればよいですか? たとえば、次の場合:

var otherField = new ObjectId('xxxxxxx');
this.aggregate(
    {$unwind: "$tags"},
    {$match: {tags: {$in: pip.activity.tags}}},
    {$group : {_id : '$_id',matches:{$sum:1}}},
    {$project: { _id: 0,matches:1,otherField:otherField}}, <-- include otherField
    {$sort: {matches:-1 }},
    callback
);

これは可能ですか、またはこの特定のステップに forLoop または MapReduce を使用する必要がありますか? 私は本当に効率的なものを探しています。

4

1 に答える 1

1

$project パイプライン オペレーターではオブジェクトを挿入できませんが、オブジェクト ID を $group オペレーターの前に挿入できる可能性があります。コレクションがある場合:

db.foo.save({_id:1,tags:['a','b']})
db.foo.save({_id:2,tags:['b','c']})
db.foo.save({_id:3,tags:['c','d']})

次に、次のように記述できます。

db.foo.aggregate({
 $unwind: "$tags"},{ 
 $match: { tags: {$in: ['b','c'] } }},{
 $group: { _id: "$_id", matches: {$sum: 1 }, otherField: {$min: new ObjectId()} }},{
 $project: { _id: 0, matches: 1, otherField: 1 }},{
 $sort: { matches: -1 }})

ここでは $min または $max を使用できますが、演算子またはフィールドへの参照が必要になるため、1 つ指定する必要があります。

于 2013-03-14T02:06:24.740 に答える