2013-07-20 20 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輕鬆做到這一點。我不確定你可以簡單地使用聚合。不幸的是,現在不支持$ slice運算符。 – 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 
}) 

注意,集團將在分片環境不工作。