MongoDB - 聚合到另一个集合?

时间:2013-06-20 14:55:10

标签: mongodb mapreduce aggregation-framework

我有一个流程,我目前正在使用Mongo的Map / Reduce框架,但它的表现并不是很好。这是一个非常简单的聚合,我在3个字段上进行bucketize,返回4个不同字段的总和,并传递另外4个字段的值(在每个桶中都是常量)。

由于[Map-Reduce performance in MongoDb 2.2, 2.4, and 2.6]中描述的原因,我想将其转换为聚合框架以获得更好的性能,但我认为有三件事情存在:

  1. 总结果可能很大,超过Mongo的16MB限制,即使结果中的任何一个文档非常小。
  2. 我可以直接映射/缩减到另一个集合,但聚合框架只能内联返回结果(我认为?)
  3. 对于增量更新,随着更多数据到达源集合,我可以使用设置为MapReduceCommand.OutputType的{​​{1}}(在Java中)映射/缩小,与我的用例完全匹配,但我看不到聚合框架中的相应功能。
  4. 在聚合框架中有没有很好的方法来解决这些问题?服务器现在是版本2.4.3 - 如果有新功能,我们可以根据需要进行更新。

2 个答案:

答案 0 :(得分:3)

您现在可以使用$out执行此操作,如mongo

中所述

$ out获取聚合管道返回的文档并将它们写入指定的集合。 $ out运算符允许聚合框架返回任何大小的结果集。 $ out运算符必须是管道中的最后一个阶段。

该命令具有以下语法,其中包含将保存聚合操作输出的集合。 $ out仅在管道末端允许:

db.<collection>.aggregate( [
     { <operation> },
     { <operation> },
     ...,
     { $out : "<output-collection>" }
] )

答案 1 :(得分:1)

聚合框架目前无法直接输出到其他集合。但是你可以在这个讨论中尝试答案: SO-questions-output aggregate to new collection mapreduce更慢,我也一直在等待解决方案。您可以尝试使用madoodb网站支持的Hadoop到Mongodb连接器。 Hadoop在mapreduce上更快。但我不知道它是否适合您的具体情况。

Link to hadoop + MongoDB connector

一切顺利。