Map-reduce是一个考虑大型数据得到有用聚集结果的数据处理程式(paradigm).针对map-reduce操作,MongoDB提供来mapreduce命令.
考虑下面的map-reduce操作:
在这个map-reduce操作里,MongoDB为每个输入的文档(比如,集合中满足了查询条件的文档)应用了map操作.Map函数输入键值对.对拥有多个值的那些键,MongoDB采用reduce阶段,即收集和压缩聚集的数据.Mongo-DB然后把结果存在一个集合里面.Reduce函数的输出可以选择传递给一个finalize函数去进一步压缩或处理聚集结果.
在MongoDB中,所有的map-reduce函数都是javascript代码,都运行在mongod进程.Map-reduce操作接受一个集合的文档作为输入,并可以在map阶段之前执行任意排序和限制.mapreduce可以以一个文档的形式返回map-reduce操作的结果,或者可能往集合写入结果。输入和输出的集合可能是共享的。
注:
对大多数的聚集操作,聚集管道提供了更好的性能和更一致的接口。然而,map-reduce操作提供了在聚集管道所没有的灵活性。
Map-Reduce JavaScript 函数
在MongoDB,map-reduce操作使用自定义的函数去map,或者进行键和值的关联。如果一个键有多个值和它对应,则reduce操作将该键的值“减”到单一的对象(the operation reduces the values for the key to a single object)。
自定义的javascript函数给map-reduce带来了灵活性。举个例子,当处理一个文档,map函数产生多于一个的键值对匹配或者没有键值对匹配。Map-reduce函数也可以使用一个自定义的javascript函数在map和reduce函数操作结束时对结果进行最终的修改。
Map-Reduce 行为
在MongoDB,map-reduce函数能够联机往集合写入结果或返回结果。如果你将map-reduce的输出写入一个集合,你可以在相同的输入集合上执行随后的map-reduce操作,并会合并替代、合并,或者削减之前的结果。
当联机返回map-reduce操作的结果,结果文档必须在BSON Document Size限制内,目前是16M。
MongoDB支持在共享集合上的map-reduce操作,也能向共享集合输出结果。