2016-10-12 3 views
1

나는 사용자와 숫자 모음을 가지고 있습니다. 각 번호에는 AllocatedToUserId (ObjectId) 필드가 있으며, 사용자는 많은 수를 가질 수 있습니다. 단일 쿼리에서 NumbersCount를 가진 사용자를 어떻게 반환합니까? 나는이MongoDB 집계 카운트

db.getCollection('Users').aggregate([ 
     {'$lookup': {from: "Numbers", 
        localField: "_id", 
        foreignField: "AllocatedToUserId", 
        as: "Numbers"} 
     },{ '$project' : {_id:0, 
         document: '$$ROOT', 
         count: {$size:'$Numbers'}}} 
     ]) 

을 썼다 그러나이 코드와 나는 같은 응답의 구조를 가지고 각 documentNumbers 컬렉션이

[{document, count},{document, count},{document, count}...]

을, 나는 document내부 count을하고 싶습니다 번호없이 컬렉션. 가능한가? 감사!

답변

1

$$ROOT 시스템 변수로 다른 필드를 투영 할 필요는 없으며 사용자 스키마의 필드를 투사하십시오.

부여 됨으로써 사용자 스키마

{ 
    "_id": ObjectId 
    "firstName": String, 
    "lastName": String, 
    "age": Integer, 
    "location": String 
} 

파이프 라인

db.getCollection('Users').aggregate([ 
    { 
     "$lookup": { 
      "from": "Numbers", 
      "localField": "_id", 
      "foreignField": "AllocatedToUserId", 
      "as": "Numbers" 
     } 
    }, 
    { 
     "$project": { 
      "firstName": 1, 
      "lastName": 1, 
      "age": 1, 
      "location": 1, 
      "Numbers": 0, 
      "count": { "$size": "$Numbers" } 
     } 
    } 
]) 
+0

감사 : 다음 예제에서는 스키마와 사용자가 있다고 가정합니다! 네, 아마도 그게 해결책이지만 내 사용자 스키마는 ~ 25 개의 필드를 가지고 있습니다. 그래서 $$ ROOT를 사용했습니다. – Raft

+0

'$$ ROOT'를 사용하면'document' 내장 문서를 평평하게하는 또 다른'$ project' 파이프 라인을 갖게 될 것입니다 – chridam

+0

그래서 .. 그게 아마도 가장 좋은 해결책일까요? – Raft