【问题标题】:When to use map reduce over Aggregation Pipeline in MongoDB?何时在 MongoDB 中使用 map reduce 而不是聚合管道?
【发布时间】:2015-08-04 04:21:33
【问题描述】:
在查看 documentation 的 map-reduce 时,我发现:
注意:
对于大多数聚合操作,聚合管道提供
更好的性能和更连贯的界面。但是,map-reduce
操作提供了一些目前在
聚合管道。
我不是很明白。
- 在聚合管道上使用 map-reduce 的用例有哪些?
- map-reduce 提供了哪些灵活性?
- 性能有多少增量?
【问题讨论】:
标签:
mongodb
mapreduce
aggregation-framework
【解决方案1】:
一方面,MongoDB 中的 Map/Reduce 不是为即席查询而设计的,M/R 的开销很大。由于这种开销,即使是对小型数据集进行非常简单的 M/R 操作也可能需要数百毫秒。
在实践中我不能说 M/R 与聚合框架在大型数据集上的性能相比,但理论上,大型分片数据库上的 M/R 操作应该更快,因为分片可以运行操作大部分是并行的。
至于灵活性,由于 M/R 实际上运行 javascript 方法,因此您可以使用该语言的全部功能。例如,假设您想按字段值的余弦对一些数据进行分组。由于聚合框架中既没有 $cos 运算符,也没有从连续数字构建离散桶的有意义的方法(类似于 $truncate),因此聚合框架在这种情况下无济于事。
所以,简而言之,我会说用例是
- 将 M/R 的结果保存在单独的集合中并不时更新(使用
out 参数并合并结果)
- 对大型分片数据集的复杂查询
- 查询过于复杂以至于您无法使用聚合框架。我会说这是数据结构设计缺陷的一个相当肯定的迹象,但原则上,它可以提供帮助