MongoDB聚合框架$ Project额外的ObjectId参考字段

时间:2013-03-13 18:14:10

标签: mongodb aggregation-framework

说我有以下内容:

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?我正在寻找一些非常有效的东西。

1 个答案:

答案 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,但它需要一个操作符或对一个字段的引用,所以你必须给它一个..