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

时间:2012-09-09 07:37:00

标签: mongodb mapreduce mongodb-query aggregation-framework

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

编辑:
另外,如果您可以在新的2.2版本发布后明确指出这些命令中的任何新内容,那就太棒了。

1 个答案:

答案 0 :(得分:72)

由于名称相似,所以有点令人困惑,但group() command是聚合框架中$group pipeline operator的不同功能和实现。

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

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

group()命令

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

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

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

  • 当前限制

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

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

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

    • 不适用于分片集合。

  • 另请参阅: group() command examples

的MapReduce

  • 实现MapReduce model以处理大型数据集。

  • 可以从多个output options中选择一个(内联,新收集,合并,替换,缩减)

  • MapReduce函数是用JavaScript编写的。

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

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

  • MongoDB 2.2为sharded map reduce output实现了更好的支持。

  • 当前限制

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

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

      < / LI>
    • MapReduce函数可能难以调试。您可以使用print()printjson()mongod日志中包含诊断输出。

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

  • 另请参阅: Map/Reduce examples

聚合框架

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

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

  • 返回内联结果集。

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

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

  • 管道运营商无需为每个输入文档生成一个输出文档:运营商也可能生成新文档或过滤掉文档。

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

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

  • 当前限制

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

    • 不支持与MapReduce

    • 一样多的输出选项
    • 受限于聚合框架支持的operators and expressions(即无法编写自定义函数)

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

  • 另请参阅: Aggregation Framework examples

  

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

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