2014-09-04 2 views
7

mongodb에서 중첩 된 그룹 쿼리를 구현하려고하는데 외부 그룹을 추가하려고 시도하고 있습니다. 다음과 같은 (단순화 된) 데이터 문서를 제공합니다 :MongoDB 중첩 그룹?

{ 
    "timestamp" : ISODate(), 
    "category" : "movies", 
    "term" : "my movie" 
} 

나는 모든 카테고리의 목록을 얻으려고 노력하고 있으며, 카테고리 내에서 가장 많은 수의 용어가 있어야합니다. 이 같은 내 출력 뭔가를 싶습니다

아래 그림과 모든 카테고리의 상위 5 개를 얻을 것이다으로
[ 
{ category: "movies", 
    terms: [ { term: "movie 1", total: 5000 }, { term: "movie 2", total: 200 } ... ] 
}, 
{ category: "sports", 
    terms: [ { term: "football 1", total: 4000 }, { term: "tennis 2", total: 250 } ... ] 
}, 
] 

내 '내부 그룹'입니다 : 내가 가겠어요 어떻게

db.collection.aggregate([ 
    { $match : { "timestamp": { $gt: ISODate("2014-08-27") } } }, 
    { $group : { _id : "$term", total : { $sum : 1 } } }, 
    { $sort : { total : -1 } }, 
    { $limit: 5 } 
]); 

// Outputs: 
{ "_id" : "movie 1", "total" : 943 } 
{ "_id" : "movie 2", "total" : 752 } 

을 '외부 집단'을 구현하는 것인가?

때때로 위의 집계] 이온은 null 값을 반환합니다 (모든 문서에 용어 값이있는 것은 아님). null 값을 무시하려면 어떻게해야합니까?

미리 감사드립니다.

답변

12

이 경우 두 개의 그룹이 필요합니다. 제 2 그룹은 다음 배열로 카테고리 병합 $push 연산자를 사용하여 한 번에 동일한 기간에 모든 문서를 병합한다

{ $group : { 
     _id : { 
     category: "$category", 
     term: "$term", 
     }, 
     total: { $sum : 1 } 
    } 
} 

: 제 기는 용어 및 카테고리마다 하나 개의 문서와 문서들의 스트림을 생성한다 :

{ $group : { 
     _id : "$_id.category", 
     terms: { 
      $push: { 
       term:"$_id.term", 
       total:"$total" 
      } 
     } 
    } 
} 
+1

감사합니다! 이것은 내 문제를 해결했으며 두 그룹 사이에'{$ sort : {total : -1}} '을 추가하여 가장 그룹화 된 용어 전체를 맨 위에 표시했지만 용어를 제한하는 방법을 알 수는 없습니다 to say 카테고리 당 5. 그룹 사이에'{$ limit : 6} '을 (를) 추가해도 작동하지 않습니다. (나는 카테고리 별 쿼리에서 상위 5 개의 용어를 사용하려고 노력하고있다). 감사! – clangers