MongoDB - 将聚合结果写入另一个集合?

4
我有一个使用Mongo的Map/Reduce框架进行的过程,但性能不佳。这是一个相当简单的聚合操作,其中我对3个字段进行分组,并返回4个字段的总和,以及传递另外4个字段(每个桶内都是恒定的值)。
如[ Map-Reduce performance in MongoDb 2.2, 2.4, and 2.6 ]所述,出于某些原因,我希望将其转换为聚合框架以获得更好的性能,但有3件事阻挡了我:
  1. 总结果可能很大,超过Mongo的16MB限制,即使结果中的任何一个文档都非常小。
  2. 我可以直接映射/减少到另一个集合,但聚合框架只能返回内联结果(我认为?)
  3. 对于源集合中到达的更多数据的增量更新,我可以使用Map/Reduce,其中Java中的MapReduceCommand.OutputType设置为REDUCE,与我的用例完全匹配,但我没有看到聚合框架中的相应功能。
有没有好的方法来解决聚合框架中的这些问题?服务器目前版本为2.4.3-如果有新的功能,我们可以根据需要进行更新。

1
  1. 你能把工作“分块”成更小的部分吗?
  2. 只有内联。
  3. 聚合只运行一次(尽管你可以通过客户端将结果保存到另一个集合中)。
- WiredPrairie
对于第三点,如果您的第一步是 {$match: ...} 仅选择新数据,则聚合可以轻松地成为增量操作。 - Ken Williams
最糟糕的部分在于这个流程非常简单且运行速度非常快,但我实际上无法使用结果。 - Ken Williams
这就是为什么我在问你是否可以将聚合分成较小的段并将它们保存到另一个集合中的原因? - WiredPrairie
可能是有可能的,但并不容易。很难预测任何给定块的输出大小,并且分块方案可能需要重新设计以适应数据变化。我的“最糟糕的部分”评论的意思是Mongo似乎没有问题计算结果,但在实际返回结果时会出现问题。 - Ken Williams
显示剩余3条评论
2个回答

4
您现在可以使用Mongo文档中介绍的$out来实现。$out会接收聚合管道返回的文档,并将它们写入到指定的集合中。$out操作符使聚合框架可以返回任意大小的结果集。注意,$out操作符必须是管道中的最后一个阶段。以下是该命令的语法,其中表示将保存聚合操作结果的集合。请注意,$out只能出现在管道的最后一个位置:
db.<collection>.aggregate( [
     { <operation> },
     { <operation> },
     ...,
     { $out : "<output-collection>" }
] )

不幸的是,这仍然没有解决原问题中的第三个问题,但我同意这是一个很大的进步。 - Ken Williams
无法在2.6之前使用$out。当$out不可用时,如何处理聚合到另一个集合的想法? - conner.xyz

1
聚合框架目前无法直接输出到另一个集合。但是您可以尝试这个讨论中的答案: SO-questions-output aggregate to new collection MapReduce速度较慢,我也一直在等待解决方案。您可以尝试使用Hadoop到MongoDB连接器,该连接器受到mongodb网站的支持。 Hadoop在MapReduce方面更快。但我不知道它是否适合您的特定情况。 Link to hadoop + MongoDB connector 祝一切顺利。

1
这解决了问题#2,但不幸的是没有解决#1和#3。我可能可以通过手动获取结果并进行缩减来解决#3。但我能想到的解决#1的唯一方法是一次咬下更小的块,这在查询之前很难预先确定。 - Ken Williams
1
澄清一下 - 当我说“那个”时,我指的是你的第一个想法。我会看一下Hadoop+MongoDB连接器,以前我没有看过。谢谢。 - Ken Williams
是的,分解它可能是解决#1的唯一方法(抱歉没有太多帮助)。但随着数据变得越来越大,这在大多数情况下都是不切实际的。我以前也遇到过聚合框架可用性有限的类似问题。希望MongoDB能够升级Mapreduce或Aggregate框架。 - Sai
2
或者等待2.6版本,该版本将从聚合框架返回游标,并允许您将结果输出到另一个集合。 - Asya Kamsky
很高兴听到这个消息,@AsyaKamsky。我不知道有没有在线路线图显示2.6中计划包含什么? - Ken Williams
2
是的 - 您可以在任何服务器票证的“修复版本”字段中以其最原始的形式看到它:https://jira.mongodb.org/browse/SERVER-3253,您已经看到了,并且您可以通过单击修复版本来查看它在版本序列中的位置 - 即2.5.w是进入2.6发布之前所有2.5.x和2.5.desired等的顶部存储桶。 - Asya Kamsky

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