我有一个进程,我目前正在使用Mongo的Map/Reduce框架,但它的性能不是很好。这是一个非常简单的聚合,我将3个字段放入桶中,返回4个不同字段的和,并传递另外4个字段的值(每个桶中都是常量)。
由于[MongoDb 2.2, 2.4和2.6中的Map-Reduce性能]中描述的原因,我想将其转换为聚合框架以获得更好的性能,但有3件事阻碍了我的想法:
- 总的结果可以很大,超过Mongo的16MB限制,即使结果中的任何一个文档都非常小。
- 我可以直接映射/减少到另一个集合,但聚合框架只能内联返回结果(我认为?)
- 对于增量更新,随着更多的数据到达源集合,我可以将
MapReduceCommand.OutputType
(在Java中)映射/reduce设置为REDUCE
,完全匹配我的用例,但我在聚合框架中没有看到相应的功能。
在聚合框架中是否有好的方法来解决这些问题?服务器现在是2.4.3版本,如果有新的功能,我们可能会根据需要进行更新。
您现在可以使用$out来完成这个操作,正如mongo
中所解释的那样$out获取聚合管道返回的文档,并将它们写入指定的集合。$out操作符允许聚合框架返回任意大小的结果集。$out操作符必须是管道中的最后一个阶段。
该命令具有以下语法,其中是保存聚合操作输出的集合。$out只允许出现在管道的末尾:
db.<collection>.aggregate( [
{ <operation> },
{ <operation> },
...,
{ $out : "<output-collection>" }
] )
聚合框架目前不能直接输出到另一个集合。然而,你可以在这个讨论中尝试答案:SO-questions-output聚合到新集合mapreduce要慢得多,我也一直在等待解决方案。您可以尝试Hadoop to Mongodb连接器,Mongodb网站支持该连接器。Hadoop在mapreduce上更快。但我不知道它是否适合你的具体情况。
hadoop + MongoDB连接器链接
祝你一切顺利。