分片集合与Map-Reduce
注意
聚合管道作为Map-Reduce的替代方案
从MongoDB 5.0开始,map-reduce 已弃用
与 map-reduce 相比,您应使用一个 聚合管道。聚合管道比map-reduce提供了更好的性能和可用性。
对于需要自定义功能的map-reduce操作,您可以使用
$accumulator
和$function
聚合运算符。您可以使用这些运算符在JavaScript中定义自定义聚合表达式。
有关聚合管道作为map-reduce替代方案的示例,请参阅
Map-reduce支持对分片集合的操作,无论是作为输入还是作为输出。本节描述了针对分片集合的特定于 mapReduce
的行为。
分片集合作为输入
当使用分片集合作为map-reduce操作的输入时,mongos
将自动并行将map-reduce任务分发到每个分片。不需要特殊选项。mongos
将等待所有分片上的任务完成。
分片集合作为输出
如果 out
字段对于 mapReduce
的值是 sharded
,MongoDB 将使用 _id
字段作为分片键来分片输出集合。
输出到分片集合
如果输出集合不存在,首先创建分片集合。
如果输出集合已存在但不是分片的,map-reduce 将失败。
对于新的或空的分片集合,MongoDB 使用 map-reduce 操作的第一阶段的结果来创建初始的 数据块,并将这些数据块分布在各个分片之间。
mongos
将 map-reduce 后处理作业并行发送到拥有数据块的所有分片。在后处理期间,每个分片将从其他分片拉取其数据块的结果,运行最终的 reduce/finalize,并将结果写入本地输出集合。
注意
在后续的 map-reduce 作业中,MongoDB 根据需要拆分数据块。
为了防止并发问题,在后处理期间自动防止输出集合的数据块平衡。