使用$out-of-aggregate在mongodb中连接两个聚合结果

使用$out-of-aggregate在mongodb中连接两个聚合结果,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我有一个报告应用程序,我生成mongodb命令,它涉及运行三个聚合调用。聚合调用的管道中有[match、group、project] RESULT OF AGGREGATE 1-3 {_id: <XXX>, ...} 聚合结果1-3 {u id:,…} 这些调用的分组“_id”是相同的,但是,由于它们的$match不同,它们不能在同一个聚合调用中。我需要加入所有这些聚合结果。我知道解决这个问题的一种方法是在$group阶段使用条件,但问题是条件非常复杂,无法与已经很复杂的$gro

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

RESULT OF AGGREGATE 1-3
{_id: <XXX>, ...}
聚合结果1-3 {u id:,…} 这些调用的分组“_id”是相同的,但是,由于它们的$match不同,它们不能在同一个聚合调用中。我需要加入所有这些聚合结果。我知道解决这个问题的一种方法是在$group阶段使用条件,但问题是条件非常复杂,无法与已经很复杂的$group管道混合

提供一些背景,说明为什么该解决方案即使不是不可能,也是非常困难的;数据非常庞大,每个文档有700个属性,文档每天大约有1k。在$group阶段的每个字段中生成如此复杂的条件将造成混乱


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

如果确实要合并聚合结果,则可以使用批量升级创建输出集合。为了提高性能,您可以在此输出集合上创建一个具有分组属性的复合索引

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});
    })    
})

在这里,您的
数据数组是使用
$out
集合上的find创建的。

如果您确实想继续合并聚合结果,那么您可以使用bulk upserts创建输出集合。为了提高性能,您可以在此输出集合上创建一个具有分组属性的复合索引

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});
    })    
})

这里,您的
数据数组是使用
$out
集合上的find创建的。

基本上是正确的方法,但它需要上下文。人们只是不使用mongodb shell来部署应用程序。问题的某些特定语言和其他部分本应得到更好的澄清。因此,这实际上是一个“过于宽泛”的回答,因为它无法解决问题中未解释的所有问题。我们试图给出如何做的提示。在回答时,肯定会考虑您的反馈。谢谢。我“同意”这可能是正确的方法。但OP的问题是对某个断言的概括。基本上是正确的方法,但它需要上下文。人们只是不使用mongodb shell来部署应用程序。问题的某些特定语言和其他部分本应得到更好的澄清。因此,这实际上是一个“过于宽泛”的回答,因为它无法解决问题中未解释的所有问题。我们试图给出如何做的提示。在回答时,肯定会考虑您的反馈。谢谢。我“同意”这可能是正确的方法。但是OP的问题是对某个断言的扩展。好吧,
$out
总是覆盖一个集合,基本上你需要做的是迭代游标,每次游标迭代输出到另一个集合,或者做任何你需要做的事情。问题中完全没有这个细节。忘记那些可怕的数字吧,因为它们并不相关。相反,用基本文档示例和期望的结果来描述实际问题。好的,
$out
总是覆盖一个集合,基本上你需要做的是迭代游标,每次游标迭代都输出到另一个集合,或者做任何你需要做的事情。问题中完全没有这个细节。忘记那些可怕的数字吧,因为它们并不相关。而是用基本文档示例和期望的结果来描述实际问题。