Docs 主页 → 开发应用程序 → MongoDB Manual
Map-Reduce 和分片集合
注意
聚合管道作为 Map-Reduce 的替代方案
从 MongoDB 5.0 开始, map-reduce已弃用:
您应该使用聚合管道,而不是 map-reduce。聚合管道提供比 map-reduce 更好的性能和可用性。
对于需要自定义功能的 map-reduce 操作,可以使用
$accumulator
和$function
聚合操作符。您可以使用这些操作符在 JavaScript 中定义自定义聚合表达式。
有关 map-reduce 的聚合管道替代方案的示例,请参阅:
map-reduce 支持对分片collection进行操作,既可以作为输入,也可以作为输出。本部分介绍特定于分片集合的mapReduce
行为。
但是,从版本 4.2 开始,MongoDB 弃用了用于创建新的分片collection的 map-reduce 选项以及用于 map-reduce 的sharded
选项。要输出到分片集合,请先创建分片集合。 MongoDB 4.2 还弃用了替换现有的collection的功能。
作为输入的分片collection
使用分片集合作为 map-reduce 操作的输入时, mongos
会自动将 map-reduce 作业并行分派到每个分片。 无需特殊选项。 mongos
将等待所有分片上的作业完成。
作为输出的分片collection
如果mapReduce
的out
字段的值为sharded
,则 MongoDB 使用_id
字段作为分片键对输出collection进行分片。
注意
从版本 4.2 开始,MongoDB 不建议使用mapReduce
/ db.collection.mapReduce()
的sharded
选项。
要输出到分片collection:
如果输出集合不存在,则先创建分片集合。
从版本 4.2 开始,MongoDB 弃用了用于创建新的collection的 map-reduce 选项以及用于 map-reduce 的
sharded
选项。因此,要输出到分片集合,请先创建分片集合。如果您没有先创建分片集合,MongoDB 将在
_id
字段上创建集合并对其进行分片。 但是,建议您先创建分片collection。从版本 4.2 开始,MongoDB 已弃用替换现有分片collection的功能。
从版本 4.0 开始,如果output collection已存在但未分片,则 map-reduce 会失败。
对于新的或空的分片collection,MongoDB 使用 map-reduce 操作第一阶段的结果来创建在分片之间分布的初始数据块。
mongos
并行向拥有数据块的每个分片分派 map-reduce 后处理作业。在帖子处理过程中,每个分片都会从其他分片中提取自己的数据块结果,运行最终的 reduce/finalize,并在本地写入输出collection。
注意
在后续的 map-reduce 作业中,MongoDB 会根据需要分割数据块。
在帖子过程中,会自动阻止输出collection的数据块均衡,从而避免出现并发问题。