MongoDB聚合比较:group(),$ group和MapReduce

Aaf*_*ikh 39 mapreduce mongodb mongodb-query aggregation-framework

关于何时使用group(),与$ group或mapreduce聚合,我有点困惑.我在http://www.mongodb.org/display/DOCS/Aggregation上阅读了针对group()的文档,http://docs.mongodb.org/manual/reference/aggregation/group/#_S_group for $ group ..分片是否group()不起作用的唯一情况?另外,我觉得$ group比group()更强大,因为它可以与聚合框架中的其他管道运算符一起使用.$ group如何与mapreduce进行比较?我在某处读到它不生成任何临时集合,而mapreduce则生成.是这样吗?
有人可以提供插图或指导我一起解释这三个概念的链接,采用相同的样本数据,以便我可以轻松地比较它们吗?

编辑:
此外,如果您可以在这些命令中指出任何新的东西,那将是很好的,因为新的2.2版本出来了..

Ste*_*nie 74

这有点令人困惑,因为名称相似,但group()命令是聚合框架中$group管道运算符的不同特性和实现.

group()命令,Aggregation Framework和MapReduce是MongoDB的统一聚合功能.功能有一些重叠,但我会尝试解释MongoDB 2.2.0中每个功能的差异和局限性.

注意:下面提到的内联结果集指的是在内存中处理的查询,并在函数调用结束时返回结果.替代输出选项(目前仅适用于MapReduce)可以包括将结果保存到新的或现有的集合.

group() 命令

  • 用于分组的简单语法和功能..类似于GROUP BYSQL.

  • 返回结果集内联(作为分组项的数组).

  • 使用JavaScript引擎实现; 自定义reduce()函数可以用JavaScript编写.

  • 目前的限制

    • 不会分组到超过20,000个键的结果集.

    • 结果必须符合BSON文件的限制(目前为16MB).

    • 采用读锁定,并且在运行时不允许任何其他线程执行JavaScript.

    • 不适用于分片集合.

  • 另请参见:group()命令示例.

MapReduce的

  • 实现MapReduce模型以处理大型数据集.

  • 可以从多个输出选项中选择一个(内联,新集合,合并,替换,减少)

  • MapReduce函数是用JavaScript编写的.

  • 支持非分片和分片输入集合.

  • 可用于大型集合的增量聚合.

  • MongoDB 2.2实现了对分片地图缩减输出的更好支持.

  • 目前的限制

    • 单个发射只能容纳MongoDB的最大BSON文档大小的一半(16MB).

    • 有一个JavaScript锁,所以mongod服务器只能在某个时间点执行一个JavaScript函数.但是,MapReduce的大多数步骤都很短,因此可以经常产生锁.

    • MapReduce函数可能很难调试.您可以使用print()printjson()mongod日志中包含诊断输出.

    • 对于试图翻译关系查询聚合体验的程序员来说,MapReduce通常不直观.

  • 另请参见:Map/Reduce示例.

聚合框架

  • MongoDB 2.2.0产品发布中的新功能(2012年8月).

  • 旨在提高性能和可用性的具体目标.

  • 返回内联结果集.

  • 支持非分片和分片输入集合.

  • 使用"管道"方法,在对象通过一系列管道操作符(如匹配,投影,排序和分组)时进行转换.

  • 管道运营商不需要为每个输入文档生成一个输出文档:运营商也可以生成新文档或过滤掉文档.

  • 使用投影,您可以添加计算字段,创建新的虚拟子对象,并将子字段提取到顶级结果中.

  • 可以根据需要重复管道运算符(例如,多个$project$group步骤.

  • 目前的限制

    • 结果以内联方式返回,因此仅限于服务器支持的最大文档大小(16MB)

    • 不支持与MapReduce一样多的输出选项

    • 仅限于聚合框架支持的运算符和表达式(即无法编写自定义函数)

    • 用于聚合的最新服务器功能,因此在文档,功能集和使用方面有更多成熟空间.

  • 另请参见:聚合框架示例.

有人可以提供插图或指导我一起解释这三个概念的链接,采用相同的样本数据,以便我可以轻松地比较它们吗?

您通常不会找到比较所有三种方法都有用的示例,但以前的StackOverflow问题显示了变化:

  • @zamnuts:正如明确指出的那样,这里的答案最初是参考MongoDB 2.2.0(当时的当前版本)编写的.从那时起,已有*许多*改进,因此我鼓励审查最新的准确性文档,包括[聚合命令比较](http://docs.mongodb.org/manual/reference/aggregation-commands-comparison/)(灵感来自这个答案!).MongoDB 2.4具有更好的JavaScript并发性,改进的聚合框架性能以及新的聚合管道运算符,如`$ geoNear`(地理空间匹配). (3认同)