MongoDB 什么时候在聚合管道上使用 map reduce?

When to use map reduce over Aggregation Pipeline in MongoDB?

在查看 documentation 的 map-reduce 时,我发现:

NOTE:

For most aggregation operations, the Aggregation Pipeline provides better performance and more coherent interface. However, map-reduce operations provide some flexibility that is not presently available in the aggregation pipeline.

没看懂。

一方面,MongoDB 中的 Map/Reduce 不是为临时查询而设计的,M/R 有相当大的开销。由于这种开销,即使是对小型数据集进行非常简单的 M/R 操作也可能需要数百毫秒。

在实践中,与大型数据集上的聚合框架相比,M/R 的性能我不能说太多,但理论上,M/R 在大型分片数据库上的操作应该更快,因为分片可以 运行 大部分并行操作。

至于灵活性,由于 M/R 实际上 运行s javascript 方法,您可以使用语言的全部功能。例如,假设您想按字段值的余弦对一些数据进行分组。由于聚合框架中既没有 $cos 运算符,也没有从连续数字构建离散桶的有意义的方法(类似于 $truncate),聚合框架在这种情况下无济于事。

所以,简而言之,我想说用例是

  • 将 M/R 的结果保存在单独的集合中并不时更新(使用 out 参数并合并结果)
  • 对大型分片数据集的复杂查询
  • 查询过于复杂以至于您无法使用聚合框架。我会说这是数据结构设计缺陷的一个非常明确的迹象,但原则上,它可以帮助