I am somewhat confused about when to use group(), aggregate with $group or mapreduce. I read the documentation at http://www.mongodb.org/display/DOCS/Aggregation for group(), http://docs.mongodb.org/manual/reference/aggregation/group/#_S_group for $group.. Is sharding the only situation where group() won't work? Also, I get this feeling that $group is more powerful than group() because it can be used in conjunction with other pipeline operators from aggregation framework.. How does $group compare with mapreduce? I read somewhere that it doesn't generate any temporary collection whereas mapreduce does. Is that so?
Can someone present an illustration or guide me to a link where these three concepts are explained together, taking the same sample data, so I can compare them easily?

EDIT:
Also, it would be great if you can point out anything new specifically in these commands since the new 2.2 release came out..

推荐答案

这有点令人困惑,因为名称相似,但group() command与聚合框架中的$group pipeline operator是不同的特性和实现.

group()命令、聚合框架和MapReduce是MongoDB的统称.在功能上有一些重叠,但我将try 在MongoDB 2.2.0中解释每种功能的差异和局限性.

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

group() Command

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

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

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

  • Current Limitations

    • 不会分组到包含超过20000个键的结果集中.

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

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

    • 不适用于碎片集合.

  • 另见:100.

MapReduce

  • 实现用于处理大型数据集的MapReduce model.

  • 可以从output options个选项中 Select 一个(内联、新集合、合并、替换、减少)

  • MapReduce函数是用JavaScript编写的.

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

  • 可用于在大型集合上进行增量聚合.

  • MongoDB 2.2实现了对sharded map reduce output的更好支持.

  • Current Limitations

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

    • 有一个JavaScript锁,所以mongod服务器在一个时间点只能执行一个JavaScript函数..然而,MapReduce的大多数步骤都非常短,因此可以频繁地产生锁.

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

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

  • 另见:100.

聚合框架

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

  • 旨在提高性能和可用性.

  • 内联返回结果集.

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

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

  • 管道操作员不需要 for each 输入文档生成一个输出文档:操作员还可以生成新文档或过滤掉文档.

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

  • 管道操作符可以根据需要重复(例如,多个$project$group步).

  • Current Limitations

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

    • 不支持像MapReduce那样多的输出选项

    • 聚合框架支持的限制为operators and expressions(即无法编写自定义函数)

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

  • 另见:100.

有没有人能给我一个例子,或者 bootstrap 我找到一个链接,在这个链接中,这三个概念一起被解释,使用相同的样本数据,这样我就可以很容易地比较它们了?

通常情况下,你找不到比较这三种方法有用的例子,但下面是之前的StackOverflow问题,这些问题显示了不同:

Mongodb相关问答推荐

如何从文档列表的数组内部打印一个对象?

在出现错误时忽略mongodb事务回滚是好做法吗

最有效的Mongo聚合来展开和过滤:匹配、展开、匹配与投影和过滤

如何在Mongo中制作全覆盖索引

MongoDB - 将对象转换为数组

如何使用内部数组中的值更新文档

如何对 MongoDB setWindowFields 中当前文档以外的文档进行操作

有没有办法从另一条记录中插入一条记录

连接到远程 mongo 服务器导致异常连接失败

MongoDB:按标签获取文档

MongoDB 2.1 聚合框架总和匹配名称的数组元素

用 Redis 查询?

带有 mongodb 和 nodejs 的实时 Web 应用程序

Mongoose 与 mongodb 如何返回刚刚保存的对象?

在 mongodb 中查找字段的所有非不同值

在 MongoDB 中按条件分组

无法从 javascript 打印 BSON 对象

用于嵌入式集合的 MongoDB 首选模式.文档与数组

mongoose 使用 $cond 中的 $exists 聚合

在mongoose中创建和查找地理位置