我对何时使用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版本发布后明确指出这些命令中的任何新内容,那就太棒了。
答案 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 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问题显示了变体: