2013-03-13 3 views
0

내가 다음 말해봐? 예를 들면 다음과 같습니다.

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

$ 프로젝트 파이프 라인 연산자를 사용하면 개체를 삽입 할 수 없지만 $ ID 연산자 앞에 개체 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 }}) 

$ 분 또는 $ 최대 여기에 사용할 수 있지만, 그렇게 당신이이 필드에 운영자 또는 참조를 기대한다 그것을 하나주세요 ...

+0

감사합니다 누크 누크, 나는 그 일을 줬어 :) 잘하면 미래 버전에 MapReduce보다 나은 해결 방법이 덜 보이는 뭔가가있어! –

+0

$ 프로젝트에서 임의의 상수 BSON 값을 지정할 수있는 능력이 좋은 요청 인 것 같습니다. 이미 JIRA를 추가하거나 투표 할 가치가 있습니다. $ literal 연산자에 대한 몇 가지 토론이 있습니다. –