进入MongoDB中文手册(4.2版本)目录
Map-reduce是数据处理的一个典范,用于将大量数据压缩为有用的聚合结果。对于map-reduce操作,MongoDB提供了 mapReduce数据库命令。
注意
从4.2版开始,MongoDB弃用:
* 不建议使用map-reduce的选项创建新的分片集合,以及map-reduce的sharded选项。要输出到分片集合,首先要创建分片集合。MongoDB 4.2也不建议替换现有的分片集合。
* nonAtomic:false选项的显式规范
请考虑以下map-reduce操作:
在这个map-reduce操作中,MongoDB将map过程应用到每个输入文档(即集合中与查询条件匹配的文档)。map函数发出键-值对。对于具有多个值的那些键,MongoDB应用reduce过程,该过程收集并压缩聚合的数据。然后,MongoDB将结果存储在集合中。可选地是,reduce函数的输出可以通过finalize函数来进一步压缩或处理聚合结果。
MongoDB中的所有map-reduce函数都是JavaScript,并在mongod进程中运行。Map-reduce操作将单个集合的文档作为输入,并且可以在开始map过程之前执行任意排序和限制。 mapReduce可以将map-reduce操作的结果作为文档返回,也可以将结果写入集合。
注意
对于大多数聚合操作, 聚合管道可提供更好的性能和更一致的接口。但是,map-reduce操作提供了一些聚合管道中当前还没有的灵活性。
1 Map-Reduce JavaScript函数
在MongoDB中,map-reduce操作使用自定义JavaScript函数将值映射或关联到键。如果一个键具有映射到它的多个值,则该操作会将键的值减少(reduces)为单个对象。
自定义JavaScript函数的使用为map-reduce操作提供了灵活性。例如,在处理文档时,map函数可以创建多个键和值映射,也可以不创建任何映射。Map-reduce操作还可以使用自定义JavaScript函数在map的末尾对结果进行最终修改,并进行reduce操作,例如执行附加的计算。
4.2.1版本开始,MongoDB的不赞成map、reduce和finalize函数使用scope(即使用JavaScript的BSON类型15)。要限制变量的范围,请改用scope参数。
2 Map-Reduce结果
在MongoDB中,map-reduce操作可以将结果写入集合或返回内联的结果( return the results inline)。如果将map-reduce将输出写入集合,则可以在同一输入集合上执行随后的map-reduce操作,这个合并操作将先前的结果替换,合并或减少(reduce )为新的结果。有关详细信息和示例,请参见mapReduce和执行增量map-reduce。
当内联的map-reduce操作的返回结果时,结果文档必须在BSON文档大小限制(当前为16兆字节)内。有关map-reduce操作的限制和约束的其他信息,请参见 mapReduce参考页。
3 分片集合
MongoDB支持对分片集合进行 map-reduce操作。
但是,从4.2版开始,MongoDB不建议使用map-reduce的选项创建新的分片集合,以及map-reduce的sharded选项。要输出到分片集合,首先要创建分片集合。MongoDB 4.2也不建议替换现有的分片集合。
请参阅Map-Reduce和分片集合。
4 视图
视图不支持map-reduce操作。
进入MongoDB中文手册(4.2版本)目录