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

我有点困惑,何时使用group(),与$ group或mapreduce聚合。 我阅读了http://www.mongodb.org/display/DOCS/Aggregation for group()的文档, http: //docs.mongodb.org/manual/reference/aggregation/group/#_S_group for $ group ..分组唯一的情况是group()不能工作吗? 另外,我感觉到$ group比group()更强大,因为它可以与其他pipe道运算符一起用于聚合框架。$ group与mapreduce比较如何? 我读了一个地方,它不会产生任何临时收集,而mapreduce呢。 是这样吗?
有人可以提供一个插图或引导我到这三个概念一起解释的链接,采取相同的样本数据,所以我可以轻松地比较它们吗?

编辑:
另外,如果你能在这些命令中特别指出新的东西,那么这将是非常棒的。

由于名称是相似的,所以有点令人困惑,但是group()命令与Aggregation Framework中的$grouppipe理运算符是不同的function和实现。

group()命令,Aggregation Framework和MapReduce是MongoDB的集合function 。 在function上有一些重叠,但是我会试着解释一下MongoDB 2.2.0的不同之处和局限性。

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

group()命令

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

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

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

  • 电stream限制

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

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

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

    • 不适用于分片集合。

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

MapReduce的

  • 实现用于处理大型数据集的MapReduce模型 。

  • 可以从几个输出选项中select一个(内联,新收集,合并,replace,减less)

  • MapReduce函数是用JavaScript编写的。

  • 支持非分片和分片input集合。

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

  • MongoDB 2.2实现了更好的支持sharded map reduce输出 。

  • 电stream限制

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

    • 有一个JavaScript锁,所以一个mongod服务器只能在某个时间点执行一个JavaScript函数。但是,MapReduce的大部分步骤都很短,所以可以频繁地获取锁。

    • MapReduce函数可能很难debugging。 您可以使用print()printjson()将诊断输出包含在mongod日志中。

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

  • 另请参阅: Map / Reduce示例

聚合框架

  • MongoDB 2.2.0产品版本中的新function(2012年8月)。

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

  • 返回结果集内联。

  • 支持非分片和分片input集合。

  • 使用“pipe线”方法,在对象经过一系列pipe线操作程序(如匹配,投影,sorting和分组)时转换对象。

  • pipe道操作员不必为每个input文档生成一个输出文档:操作员也可以生成新文档或过滤掉文档。

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

  • pipe道操作符可以根据需要重复(例如,多个$project$group步骤。

  • 电stream限制

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

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

    • 仅限于Aggregation Framework支持的操作符和expression式 (即不能编写自定义函数)

    • 用于汇总的最新服务器function,因此在文档,function设置和使用方面有更多的成熟空间。

  • 另请参阅: 聚合框架示例

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

你通常不会find比较所有三种方法有用的例子,但是这里有前面的StackOverflow问题,它们显示了变化:

  • group()与Aggregation Framework
  • MapReduce与聚合框架