您是否考虑过使用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
})
请注意,组不会在分片环境中工作。