在mongo外壳中,该db.collection.mapReduce()
方法是mapReduce命令的包装。以下示例使用该db.collection.mapReduce()方法:
聚合管道作为替代
聚合流水线 比map-reduce提供更好的性能和更一致的接口。
各种地图-减少表达式可以使用被重写聚合管道运营商,诸如$group,
$merge等
下面的示例包括聚合管道备选方案。
orders使用以下文档创建样本集合:
对orders集合执行map-reduce操作,以对进行分组cust_id,并计算price每个的
的总和cust_id:
定义地图功能来处理每个输入文档:
this指的是map-reduce操作正在处理的文档。price到cust_id每个文档的,并发出cust_id和price对。用两个参数keyCustId和定义相应的reduce函数
valuesPrices:
valuesPrices是一个数组,其元素是price
由地图功能发射并由分组值keyCustId。valuesPrice数组简化为其元素的总和。orders使用mapFunction1map函数和reduceFunction1
reduce函数对集合中的所有文档执行map-reduce 。
此操作将结果输出到名为的集合
map_reduce_example。如果map_reduce_example集合已经存在,则该操作将用此map-reduce操作的结果替换内容。
查询map_reduce_example集合以验证结果:
该操作返回以下文档:
在此示例中,您将对值大于或等于的orders所有文档在集合上执行map-reduce操作
。工序按字段分组
,并计算每个的订单数量和总订购量。然后,该操作将为每个值计算每个订单的平均数量,并将结果合并到输出集合中。合并结果时,如果现有文档的密钥与新结果相同,则该操作将覆盖现有文档。如果不存在具有相同密钥的文档,则该操作将插入该文档。ord_date2020-03-01item.skuskusku
定义地图功能来处理每个输入文档:
this指的是map-reduce操作正在处理的文档。sku与一个新对象相关联,该对象value包含订单的countof 1和item qty并发出skuand value对。用两个参数keySKU和定义相应的reduce函数
countObjVals:
countObjVals是一个数组,其元素是映射到keySKU由map函数传递给reducer函数的分组值的对象。countObjVals数组简化为reducedValue包含count和
qty字段的单个对象。reducedVal,该count字段包含
count各个数组元素的qty字段总和,而该字段包含各个数组元素的
字段总和qty。定义有两个参数的函数敲定key和
reducedVal。该函数修改reducedVal对象以添加一个名为的计算字段,avg并返回修改后的对象:
在执行的map-reduce操作orders使用集合mapFunction2,reduceFunction2和
finalizeFunction2功能。
此操作使用该query字段选择仅ord_date大于或等于的那些文档。然后将结果输出到集合
。new
Date("2020-03-01")map_reduce_example2
如果map_reduce_example2集合已经存在,则该操作会将现有内容与该map-reduce操作的结果合并。即,如果现有文档具有与新结果相同的密钥,则该操作将覆盖现有文档。如果不存在具有相同密钥的文档,则该操作将插入该文档。
查询map_reduce_example2集合以验证结果:
该操作返回以下文档: