如何将结果聚合并合并到一个集合中?

13

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

“map-reduce”功能具有“输出模式”,包括“merge”,它可以实现我的需求。我正在寻找相应的聚合等效方法。

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

我有没有漏掉什么或者聚合功能确实缺少这个功能?

4个回答

11

我使用聚合的输出将数据插入/合并到集合中:

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

最佳HW6资源。 - VimNing

4
阅读文档可以很明确地回答这个问题。目前,Mongo无法实现您想要的功能。 $out操作会在当前数据库中创建一个新集合(如果不存在)。直到聚合完成后,该集合才会变为可见状态。如果聚合失败,则MongoDB不会创建该集合。
如果$out操作指定的集合已经存在,则在聚合完成后,$out阶段将原子性地用新结果集合替换现有集合。$out操作不会更改先前集合上存在的任何索引。如果聚合失败,则$out操作不会对先前集合进行任何更改。

谢谢,我确实阅读了那个页面(因此在我的问题中提供了链接),并描述了解决方法。我想知道是否有其他机制可以做到这一点。 - Joe
如果您直接在Shell中工作,可以考虑使用此处描述的解决方案:http://learnmongo.com/posts/easily-move-documents-between-collections-or-databases/ 但是当然,这不会在服务器端执行,而需要获取和重新插入数据。 - chk
谢谢,但这将导致来回复制数百万条记录,远远超过16MB! - Joe
是的,我很确定这对你来说不合适。你的解决方法可能是正确的选择。我猜 'mongoimport' 这样的东西也不是一个选项? - chk

3

最近版本(4.2)中提供了新功能,您可以使用聚合管道中的$merge运算符来实现此操作。它需要在管道中作为最后一个阶段。

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

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接