【问题标题】:How to aggregate and merge the result into a collection?如何将结果聚合并合并到一个集合中?
【发布时间】:2014-01-25 10:15:10
【问题描述】:

我想汇总结果并将其插入现有集合,而不删除该集合。该文档似乎表明这不是直接可能的。我觉得这很难相信。

map-reduce 功能具有“输出模式”,包括“合并”,可以满足我的需求。我正在寻找聚合的等价物。

新的$out 聚合阶段支持插入到集合中,但它会替换集合而不是更新它。如果我这样做,我将(我认为)必须运行另一个 map-reduce 以将其合并到另一个集合中,这似乎效率低下。

是我遗漏了什么还是只是聚合功能中遗漏了一些功能?

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    对于最近使用此功能的任何人,从 4.2 版开始提供此功能,您将能够在聚合管道中使用 $merge 运算符来执行此操作。它必须是管道中的最后一个阶段。

    { $merge: { into: "myOutput", on: "_id", whenMatched: "replace", whenNotMatched: "insert" } }
    

    【讨论】:

      【解决方案2】:

      我使用聚合的输出来插入/合并到集合:

          db.coll2.insert(
            db.coll1.aggregate([]).toArray()
          )
      

      【讨论】:

      • 最好的 hw6 资源。
      【解决方案3】:

      如果您不坚持使用聚合运算符,您可以对集合执行增量映射缩减。此运算符允许您将结果合并到现有集合中。

      请参阅以下文档:

      http://docs.mongodb.org/manual/tutorial/perform-incremental-map-reduce/

      【讨论】:

        【解决方案4】:

        阅读documentation 非常准确地回答了这个问题。 Atm mongo 无法为所欲为。

        $out 操作会在当前数据库中创建一个新集合(如果尚不存在)。在聚合完成之前,该集合不可见。如果聚合失败,MongoDB 不会创建集合。

        如果 $out 操作指定的集合已经存在,则在完成聚合后,$out 阶段会自动将现有集合替换为新的结果集合。 $out 操作不会更改先前集合中存在的任何索引。如果聚合失败,$out 操作不会更改之前的集合。

        【讨论】:

        • 谢谢,我确实阅读了该页面(因此我的问题中的链接)并描述了解决方法。我在问是否有其他机制可以做到这一点。
        • 如果您直接在 shell 中工作,您可以考虑类似于此处描述的解决方案 learnmongo.com/posts/… 但当然这不会在服务器端执行,但需要获取并重新插入数据
        • 谢谢,但这会导致前后复制数百万条记录,远远超过 16MB!
        • 是的,我很确定这不适合你。您的解决方法可能是要走的路。我想像'mongoimport'这样的东西也没有选择?
        猜你喜欢
        • 2018-10-19
        • 2019-01-30
        • 2020-08-20
        • 1970-01-01
        • 1970-01-01
        • 2019-04-09
        • 1970-01-01
        • 2018-04-23
        • 2019-01-17
        相关资源
        最近更新 更多