首页 文章

使用$ out of aggregate在mongodb中加入两个聚合结果

提问于
浏览
1

我有一个报告应用程序,我生成mongodb命令,它涉及运行三个聚合调用 . 聚合调用在其管道中具有[match,group,project] .

RESULT OF AGGREGATE 1-3
{_id: <XXX>, ...}

这些调用的分组“_id”是相同的,但是,因为它们的$ match不同,所以它们不能在同一个聚合调用中 . 我需要加入所有这些聚合结果 . 我知道解决这个问题的一种方法是在$ group阶段使用条件,但问题是与已经很复杂的$ group管道混合的条件非常复杂 .

给出一些背景信息为什么这个解决方案即使不是不可能也很困难数据非常庞大,每个文档都有700个属性,文档每天大约1k . 在$ group阶段的EACH字段中生成这样复杂的条件将会变得一团糟 .

我已经看到运行map-reduce的答案来组合这些聚合结果,但我正在寻找其他解决方案 . 正如我研究的那样,聚合有一个$ out管道 . 有没有办法可以操纵$ out管道加入这些聚合结果? (考虑$ out的原因是我必须保存所有结果作为报告)

1 回答

  • 0

    如果您确实希望继续合并聚合结果,则可以使用批量upsert创建输出集合 . 为了提高性能,您可以在此输出集合上创建一个复合索引,该索引具有您的分组属性 .

    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创建的 .

相关问题