2013-03-13 91 views
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字段? e.g如果我有以下几点:

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 
); 

这是可能的,或者我应该用一个for循环或MapReduce的这个特定的步骤?我正在寻找一些非常有效的东西。

回答

1

$ project pipeline运算符不会让您注入对象,但您可以在之前的$ 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和$最多可以在这里使用,但它预计运营商或引用一个字段,所以你必须给它一个..

+0

谢谢努克,我给了它一个去,它做了这份工作:)希望在未来的版本中有一些似乎更少的解决方法,仍比MapReduce更好! – 2013-03-14 09:03:01

+0

在$项目中指定任意常量BSON值的能力看起来是一个很好的请求 - 如果它已经存在,可能值得添加JIRA或投票支持。有一些关于$ literal操作符的讨论 - 可能值得关注。 – 2013-03-15 00:35:36