group()命令,Aggregation Framework和MapReduce是MongoDB的统一聚合功能 . 功能有一些重叠,但我会尝试解释MongoDB 2.2.0中每个功能的差异和限制 .
注意:下面提到的内联结果集指的是在内存中处理的查询以及在函数调用结束时返回的结果 . 替代输出选项(目前仅适用于MapReduce)可以包括将结果保存到新的或现有的集合 .
group()命令
用于分组的简单语法和功能..类似于SQL中的 GROUP BY .
返回结果集内联(作为分组项的数组) .
使用JavaScript引擎实现;自定义 reduce() 函数可以用JavaScript编写 .
Current Limitations
不会分组到超过20,000个键的结果集 .
结果必须符合BSON文件的限制(目前为16MB) .
采用读锁定,并且在运行时不允许任何其他线程执行JavaScript .
不适用于分片集合 .
另见: group() command examples .
MapReduce
可以从几个output options中选择一个(内联,新集合,合并,替换,减少)
MapReduce函数是用JavaScript编写的 .
支持非分片和分片输入集合 .
可用于大型集合的增量聚合 .
Current Limitations
单个发射只能容纳MongoDB的最大BSON文档大小的一半(16MB) .
有一个JavaScript锁,所以mongod服务器只能在某个时间点执行一个JavaScript函数 . 但是,MapReduce的大多数步骤都非常短,因此可以经常产生锁 .
MapReduce函数可能难以调试 . 您可以使用 print() 和 printjson() 在 mongod 日志中包含诊断输出 .
MapReduce对于尝试翻译关系查询聚合体验的程序员来说通常不直观 .
另见: Map/Reduce examples .
聚合框架
MongoDB 2.2.0 生产环境 版本中的新功能(2012年8月) .
旨在提高性能和可用性的具体目标 .
返回结果集内联 .
支持非分片和分片输入集合 .
使用“管道”方法,对象在通过一系列管道操作符(如匹配,投影,排序和分组)时进行转换 .
管道运算符不需要为每个输入文档生成一个输出文档:运算符也可以生成新文档或过滤掉文档 .
使用投影,您可以添加计算字段,创建新的虚拟子对象,并将子字段提取到顶级结果中 .
可以根据需要重复管道运算符(例如,多个 $project 或 $group 步骤 .
Current Limitations
结果以内联方式返回,因此仅限于服务器支持的最大文档大小(16MB)
不支持与MapReduce一样多的输出选项
用于聚合的最新服务器功能,因此在文档,功能集和使用方面有更多成熟空间 .
另见: Aggregation Framework examples .
有人可以提供插图或指导我一起解释这三个概念的链接,采用相同的样本数据,这样我可以轻松地比较它们吗?
您通常不会找到比较所有三种方法都有用的示例,但以前的StackOverflow问题显示了变化: