说我有以下内容:
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?我正在寻找一些非常有效的东西。
答案 0 :(得分: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,但它需要一个操作符或对一个字段的引用,所以你必须给它一个..