Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 聚合推送N个数组结果_Mongodb_Mongoose_Aggregation Framework - Fatal编程技术网

Mongodb 聚合推送N个数组结果

Mongodb 聚合推送N个数组结果,mongodb,mongoose,aggregation-framework,Mongodb,Mongoose,Aggregation Framework,我有以下汇总: db.reports.aggregate({ $group: { _id: "$user", reports: { $push: {report: {properties: "$properties"} } }}}, { $project: { _id: 0, user: "$_id", reports: "$reports"} }) 我想以某种方式限制推送到阵列中的报告数量。例如,我想将报告限制为用户定义的值。1,5,10等表示我希望报告字段中包含N个报告(我将按时间戳排序)

我有以下汇总:

db.reports.aggregate({ $group: { _id: "$user", reports: { $push: {report: {properties: "$properties"} } }}}, { $project: { _id: 0, user: "$_id", reports: "$reports"} })
我想以某种方式限制推送到阵列中的报告数量。例如,我想将报告限制为用户定义的值。1,5,10等表示我希望报告字段中包含N个报告(我将按时间戳排序)。现在我正在推送所有报告,但不确定如何限制每个用户的报告数量

我尝试了$limit,但它不起作用,因为它限制了返回的用户数量,而不是推入报表数组的报表数量


基本上,我希望按用户对报告进行分组,并且只包含一定数量的报告。我希望尽可能早地限制报告的数量,这样我就不必处理整个管道中的整个集合

您考虑过使用吗?假设您的数据如下所示:

{ "_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
})

请注意,该组将在分片环境中工作。

您可以使用mapReduce轻松完成此操作。我不确定你是否可以简单地用聚合来做。不幸的是,聚合中目前不支持$slice运算符。如果使用聚合以其他方式对每个用户进行报告,是否有办法限制报告数?如果我没有进入阵列。也许会有几个小组在准备中。我不知道这是否可能。但其他人可能会提出一个想法。同时,您可以尝试my reduce来解决您的问题。@innoSPG感谢您的回复。不幸的是,reduce有点太慢了,所以我改为聚合。如果我能用聚合解决问题,我可能只需要稍微更改一下数据模型。