2013-03-13 6 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 поля в результатах? например, если у меня есть следующие:

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

Оператор конвейера $ project не позволит вам вставлять объект, но вы, вероятно, можете вставить идентификатор объекта ранее в операторе $ group. Если у вас есть коллекция:

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

в $ мин или $ макс можно использовать здесь, но он ожидает оператора или ссылку на поле, так что вы должны дайте ему один ..

+0

Спасибо Nuk Nuk, я дал это, и это сработало :) Надеюсь, в будущей версии есть что-то вроде менее обходного пути, еще лучше, чем MapReduce! –

+0

Возможность указать произвольное постоянное значение BSON в проекте $ кажется хорошим запросом - возможно, стоит добавить JIRA или проголосовать, если она уже существует. есть несколько дискуссий над оператором $ literal - возможно, стоит того. –