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中的$group
pipe理运算符是不同的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与聚合框架