2013-07-20 2 views
1

결과 나는 다음과 같은 집합이 있습니다집계 푸시 N 번호가

db.reports.aggregate({ $group: { _id: "$user", reports: { $push: {report: {properties: "$properties"} } }}}, { $project: { _id: 0, user: "$_id", reports: "$reports"} }) 

어떻게 든 배열에 얻을수 보고서의 수를 제한하고자합니다. I.E보고를 사용자가 정의한 값으로 제한하려고합니다. 1,5,10 등 의미 나는 보고서 필드에 N 개의 보고서 (나는 시간 소인별로 정렬)를 포함 시키길 원한다. 지금 당장 나는 모든 보고서를 사용자 당 보고서 수를 제한하는 방법이 확실치 않다.

$ 제한을 시도했지만 보고서 배열에 푸시 된 보고서 수가 아닌 반환 된 사용자 수가 제한되어있어 작동하지 않았습니다.

기본적으로 사용자별로 보고서를 그룹화하고 특정 수의 보고서 만 포함하려고합니다. 가능한 한 조기에 보고서 수를 제한하여 파이프 라인 전체에서 전체 컬렉션을 처리하지 않아도됩니다.

+0

mapReduce로 쉽게 할 수 있습니다. 나는 당신이 단순히 집합체로 그것을 할 수 있다고 확신하지 못한다. $ 슬라이스 연산자는 현재 아쉽게도 집계에서 지원되지 않습니다. – innoSPG

+0

집계가있는 다른 방식으로 사용자 당 보고서가 있다면 숫자를 제한하는 방법이 있습니까? IE에 배열로 밀어 넣지 않았다면. 어쩌면 파이프 라인에서 몇 그룹을 할 수 있습니다. – lostintranslation

+0

가능한지 모르겠습니다. 그러나 다른 사람이 아이디어를 제안 할 수 있습니다. 한편, 당신은 내 문제를 해결하기 위해 줄일 수 있습니다. – innoSPG

답변

2

group()을 사용해 보았습니까? 이제 데이터가 다음과 같다고 가정 해 보겠습니다

{ "_id" : ObjectId("732"), "user" : "john", "reports" : [ "report1", "report2", "report3" ] } 
{ "_id" : ObjectId("733"), "user" : "john", "reports" : [ "report4", "report5", "report6" ] } 
{ "_id" : ObjectId("734"), "user" : "max", "reports" : [ "report1", "report2", "report3" ] } 
{ "_id" : ObjectId("735"), "user" : "max", "reports" : [ "report4" ] } 
{ "_id" : ObjectId("736"), "user" : "eliza", "reports" : [ "report1", "report2" ] } 

가정 보고서는 초기 스키마의 배열입니다, 당신의 집계 호출이됩니다 :

var reduce_f = function(curr, result) { 
    result.reports = result.reports.concat(curr.reports); 
}; 

var finalize_f = function(result) { 
    var limit = 5; 
    result.reports = result.reports.slice(0, limit); 
}; 

db.reports.group({ 
    key: { user: 1 }, 
    reduce: reduce_f, 
    initial: { reports : [] }, 
    finalize: finalize_f 
}) 

주 해당 그룹 것이다 분산됩니다 환경에서하지 작동합니다.