首页 文章

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

提问于
浏览
36

关于何时使用group(),与$ group或mapreduce聚合,我有点困惑 . 我在http://www.mongodb.org/display/DOCS/Aggregation为group()阅读文档,为$ group阅读http://docs.mongodb.org/manual/reference/aggregation/group/#_S_group . 正在分析group()赢得't work? Also, I get this feeling that $group is more powerful than group() because it can be used in conjunction with other pipeline operators from aggregation framework.. How does $group compare with mapreduce? I read somewhere that it doesn' t生成任何临时集合的唯一情况,而mapreduce则生成 . 是这样吗?
有人可以提供插图或指导我一起解释这三个概念的链接,采用相同的样本数据,以便我可以轻松地比较它们吗?

EDIT:
此外,如果您可以在新的2.2版本发布后指出这些命令中的任何新功能,那就太棒了 .

1 回答

  • 71

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

    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

    • 实现MapReduce model以处理大型数据集 .

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

    • MapReduce函数是用JavaScript编写的 .

    • 支持非分片和分片输入集合 .

    • 可用于大型集合的增量聚合 .

    • MongoDB 2.2为sharded map reduce output实现了更好的支持 .

    • 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一样多的输出选项

    • 受聚合框架支持operators and expressions(即无法编写自定义函数)

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

    • 另见: Aggregation Framework examples .

    有人可以提供插图或指导我一起解释这三个概念的链接,采用相同的样本数据,这样我可以轻松地比较它们吗?

    您通常不会找到比较所有三种方法都有用的示例,但以前的StackOverflow问题显示了变化:

相关问题