我有以下聚合:
db.reports.aggregate({ $group: { _id: "$user", reports: { $push: {report: {properties: "$properties"} } }}}, { $project: { _id: 0, user: "$_id", reports: "$reports"} })
我想以某种方式限制推入阵列的报告数量。 I.E我想将报告限制为用户定义的值。 1,5,10等意思我想要将N个报告(我将按时间戳排序)包含在报告字段中。现在我推动所有报告不确定如何限制每个用户的报告数量。
我尝试了$ limit,但这不起作用,因为它限制了返回的用户数量而不是推送到报告数组中的报告数量。
基本上我想按用户对报告进行分组,并且只包含一定数量的报告。我想尽早限制报告的数量,这样我就不必在整个管道中处理整个集合
答案 0 :(得分: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
})
请注意,群组不在分片环境中工作。