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 管道运算符不允许您注入对象,但您可以在 $group 运算符中更早地插入对象 ID。如果您有收藏:

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 可以在这里使用,但它需要一个运算符或对一个字段的引用,所以你必须给它一个..

于 2013-03-14T02:06:24.740 回答