我有一个报告应用,我生成mongodb命令,它涉及运行三个聚合调用。聚合调用在其管道中具有[match,group,project]。
RESULT OF AGGREGATE 1-3
{_id: <XXX>, ...}
分组&#34; _id&#34;对于这些调用是相同的,但是,因为它们的$匹配不同,所以它们不能在同一个聚合调用中。我需要加入所有这些聚合结果。我知道解决这个问题的一种方法是在$ group阶段使用条件,但问题是与已经很复杂的$ group管道混合的条件非常复杂。
给出一些背景信息为什么这个解决方案非常困难,如果不是不可能的话数据非常庞大,每个文档都有700个属性,文档每天大约1k。在$ group阶段的EACH字段中生成这样复杂的条件会弄得一团糟。
我已经看到运行map-reduce的答案来组合这些聚合结果,但我正在寻找其他解决方案。正如我所研究的那样,聚合有一个$ out管道。有没有办法可以操纵$ out管道加入这些聚合结果? (考虑$ out的原因是我必须保存所有结果作为报告)
答案 0 :(得分:0)
如果您确实要继续合并聚合结果,则可以使用批量转发创建输出集合。为了提高性能,您可以在此输出集合上创建一个复合索引,该索引具有您的分组属性。
dataArray.map(function(data) {
data.forEach(function(err, row){
var setOnInsert = {grouping_attrs: row.grouping_values, v1: row.v1}
var set = {v2: row.v2}
var query = {grouping_attrs: row.grouping_values}
bulk.find(query).upsert().update({$setOnInsert: setOnInsertStmt, $set: set});
})
})
此处dataArray
是使用$out
集合上的find创建的。{/ p>