MongoDB 聚合比较:group()、$group 和 MapReduce

Posted

技术标签:

【中文标题】MongoDB 聚合比较:group()、$group 和 MapReduce【英文标题】:MongoDB aggregation comparison: group(), $group and MapReduce 【发布时间】:2012-09-02 11:18:55 【问题描述】:

我对何时使用 group()、使用 $group 或 mapreduce 聚合感到有些困惑。我在http://www.mongodb.org/display/DOCS/Aggregation 阅读了有关 group() 的文档,http://docs.mongodb.org/manual/reference/aggregation/group/#_S_group 阅读了 $group.. 分片是 group() 不起作用的唯一情况吗?另外,我觉得 $group 比 group() 更强大,因为它可以与聚合框架中的其他管道运算符一起使用。$group 与 mapreduce 相比如何?我在某处读到它不会生成任何临时集合,而 mapreduce 会。是这样吗? 谁能提供一个插图或引导我到一个链接,将这三个概念一起解释,获取相同的样本数据,以便我可以轻松地比较它们?编辑:另外,如果您能在新的 2.2 版本发布后特别指出这些命令中的任何新内容,那就太好了..

【问题讨论】:

很好地解释了......可以提供帮助的链接是......groups.google.com/forum/?fromgroups=#!topic/mongodb-user/… @user2157221 很棒的发现,只是为了突出谷歌小组讨论中的一些事情:(1)“聚合框架可以使用索引来降低您只对子集感兴趣的操作成本集合的内容。"; (2) “等效 AF 的运行速度 [比 MR] 快 7 倍。”; (3) “使用 map reduce,您通常输出到一个集合(通常是一个临时集合)。聚合框架更适合在您真正想要做的时候将数据直接返回到调用库。” 【参考方案1】:

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

group() 命令、聚合框架和 MapReduce 统称为 MongoDB 的聚合功能。功能上有一些重叠,但我将尝试解释每个在 MongoDB 2.2.0 中的差异和限制。

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

group() 命令

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

内联返回结果集(作为分组项的数组)。

使用 javascript 引擎实现;自定义 reduce() 函数可以用 JavaScript 编写。

当前限制

不会分组到包含超过 20,000 个键的结果集中。

结果必须符合 BSON 文档的限制(当前为 16MB)。

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

不适用于分片集合。

另请参阅:group() command examples

MapReduce

实现MapReduce model 处理大型数据集。

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

MapReduce 函数是用 JavaScript 编写的。

支持非分片和分片输入集合。

可用于对大型集合进行增量聚合。

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

当前限制

单个发射只能容纳 MongoDB 最大 BSON 文档大小 (16MB) 的一半。

有一个 JavaScript 锁,因此 mongod 服务器在某个时间点只能执行一个 JavaScript 函数。但是,MapReduce 的大多数步骤都很短,因此可以经常产生锁。

MapReduce 函数可能难以调试。您可以使用print()printjson()mongod 日志中包含诊断输出。

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

另请参阅:Map/Reduce examples

聚合框架

MongoDB 2.2.0 生产版本(2012 年 8 月)中的新功能。

旨在提高性能和可用性。

内联返回结果集。

支持非分片和分片输入集合。

使用“管道”方法,对象在通过一系列管道操作符(例如匹配、投影、排序和分组)时进行转换。

管道操作员不需要为每个输入文档生成一个输出文档:操作员也可以生成新文档或过滤掉文档。

使用投影,您可以添加计算字段、创建新的虚拟子对象以及将子字段提取到***结果中。

可以根据需要重复管道运算符(例如,多个$project$group 步骤。

当前限制

结果是内联返回的,因此受限于服务器支持的最大文档大小 (16MB)

不支持与 MapReduce 一样多的输出选项

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

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

另请参阅:Aggregation Framework examples

谁能提供一个插图或引导我到一个链接,将这三个概念一起解释,获取相同的样本数据,以便我可以轻松地比较它们?

您通常不会找到比较所有三种方法有用的示例,但这里是以前的 *** 问题,它们显示了变化:

group() versus Aggregation Framework MapReduce versus Aggregation Framework

【讨论】:

@Stennie 关于 MapReduce(来自文档),(1)在 map 函数中“单个发射只能容纳 MongoDB 最大 BSON 文档大小的一半”,因此 MapReduce 具有类似的“数据大小”限制$groupgroup();见docs.mongodb.org/manual/reference/method/…。 (2) mongodb >= 2.4 允许并发 JavaScript 操作,而旧版本在单个线程中执行代码;见docs.mongodb.org/manual/core/map-reduce/#concurrency @zamnuts:正如明确指出的,这里的答案最初是参考 MongoDB 2.2.0(当时的当前版本)编写的。从那时起已经有 许多 改进,因此我鼓励查看最新文档以确保准确性,包括 Aggregation Commands Comparison(受此答案的启发!)。 MongoDB 2.4 具有更好的 JavaScript 并发性、改进的聚合框架性能以及新的聚合管道运算符,如 $geoNear(地理空间匹配)。 @Stennie,如果你能帮上忙,不胜感激***.com/questions/35426213/…

以上是关于MongoDB 聚合比较:group()、$group 和 MapReduce的主要内容,如果未能解决你的问题,请参考以下文章

mongodb MongoDB 聚合 group(转)

MongoDB:使用嵌套的 $group 聚合

Mongodb 聚合 $lookup 和 group 非常非常慢

MongoDB——聚合管道之$group操作

MongoDB——聚合管道之$group操作

Mongodb聚合查询$match和$group