2013-03-13 119 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