我对何时使用 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 会生成。是这样吗?
有人可以提供一个插图或引导我到一个链接,其中这三个概念一起解释,采用相同的样本数据,以便我可以轻松比较它们?
EDIT:
另外,如果您能特别指出自新的 2.2 版本发布以来这些命令中的任何新内容,那就太好了。
由于名称相似,这有点令人困惑,但group() command是一个不同的功能和实现$group管道操作员在聚合框架中。
group() 命令、聚合框架和 MapReduce 统称为聚合特征MongoDB 的。功能有一些重叠,但我将尝试解释 MongoDB 2.2.0 中每个功能的差异和限制。
Note: 内联结果集下面提到的查询是指在内存中处理并在函数调用结束时返回结果的查询。替代输出选项(目前仅适用于 MapReduce)可能包括将结果保存到新的或现有的集合中。
group()
Command
映射减少
实现了MapReduce模型用于处理大型数据集。
可以从多个中选择一个输出选项(内联、新集合、合并、替换、减少)
MapReduce 函数是用 JavaScript 编写的。
支持非分片和分片输入集合。
可用于大型集合的增量聚合。
MongoDB 2.2 实现了更好的支持分片映射减少输出.
-
目前的限制
一次发射只能容纳 MongoDB 最大 BSON 文档大小 (16MB) 的一半。
由于存在 JavaScript 锁,因此 mongod 服务器在某个时间点只能执行一个 JavaScript 函数。但是,MapReduce 的大多数步骤都非常短,因此可以频繁产生锁。
MapReduce 函数可能很难调试。您可以使用print()
and printjson()
将诊断输出包含在mongod
log.
对于试图转化关系查询聚合体验的程序员来说,MapReduce 通常并不直观。
也可以看看:映射/归约示例.
聚合框架
MongoDB 2.2.0 生产版本(2012 年 8 月)中的新功能。
旨在提高性能和可用性的特定目标。
返回内联结果集。
支持非分片和分片输入集合。
使用“管道”方法,对象在通过一系列管道运算符(例如匹配、投影、排序和分组)时进行转换。
管道操作员不需要为每个输入文档生成一个输出文档:操作员还可以生成新文档或过滤掉文档。
使用投影,您可以添加计算字段、创建新的虚拟子对象以及将子字段提取到顶层结果中。
管道运算符可以根据需要重复(例如,多个$project
or $group
steps.
-
目前的限制
结果以内联方式返回,因此仅限于服务器支持的最大文档大小 (16MB)
不支持与 MapReduce 一样多的输出选项
仅限于运算符和表达式由聚合框架支持(即不能编写自定义函数)
用于聚合的最新服务器功能,因此在文档、功能集和使用方面有更多的成熟空间。
也可以看看:聚合框架示例.
有人可以提供一个插图或引导我到一个链接,其中这三个概念一起解释,采用相同的样本数据,以便我可以轻松比较它们?
您通常找不到比较所有三种方法有用的示例,但以下是之前的 StackOverflow 问题,其中显示了不同的情况:
- group() 与聚合框架
- MapReduce 与聚合框架
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)