Map-Reduce 示例
最后更新于
最后更新于
在本页面
在 shell 中,方法是命令周围的 wrapper。以下示例使用方法:
聚合管道作为替代
比map-reduce提供更好的性能和更一致的接口。
各种map-reduce表达式可以使用被重写,诸如, 等
下面的示例包括聚合管道备选方案。
orders
使用以下文档创建样本集合:
对orders
集合执行map-reduce操作,以对进行分组cust_id
,并计算price
每个的 的总和cust_id
:
定义map函数来处理每个输入文档:
在函数中,this
指的是map-reduce操作正在处理的文档。
该函数将映射price
到cust_id
每个文档的,并发出cust_id
和price
对。
使用两个参数keyCustId
和定义相应的reduce函数 valuesPrices
:
valuesPrices
是一个数组,其元素是price
由map功能发射并由分组值keyCustId
。
该函数将valuesPrice
数组简化为其元素的总和。
orders
使用mapFunction1
map函数和reduceFunction1
reduce函数对集合中的所有文档执行map-reduce 。
此操作将结果输出到名为的集合 map_reduce_example
。如果map_reduce_example
集合已经存在,则该操作将用此map-reduce操作的结果替换内容。
查询map_reduce_example
集合以验证结果:
该操作返回以下文档:
使用可用的聚合管道运算符,您可以重写map-reduce操作,而无需定义自定义函数:
该阶段将以下文档输出到下一阶段:
查询agg_alternative_1
集合以验证结果:
该操作返回以下文档:
在此示例中,您将对值大于或等于的orders
所有文档在集合上执行map-reduce操作 。工序按字段分组 ,并计算每个的订单数量和总订购量。然后,该操作将为每个值计算每个订单的平均数量,并将结果合并到输出集合中。合并结果时,如果现有文档的密钥与新结果相同,则该操作将覆盖现有文档。如果不存在具有相同密钥的文档,则该操作将插入该文档。
定义map函数来处理每个输入文档:
在函数中,this
指的是map-reduce操作正在处理的文档。
对于每个商品,该函数将其sku
与一个新对象相关联,该对象value
包含订单的count
of 1
和该商品qty
,并发出sku
and 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
集合以验证结果:
该操作返回以下文档:
使用可用的聚合管道运算符,您可以重写map-reduce操作,而无需定义自定义函数:
该$unwinds
阶段按items
数组字段细分文档,以输出每个数组元素的文档。例如:
该qty
字段。该qty
字段包含qty
每个订单的总数items.sku
(请参阅参考资料$sum
)。
orders_ids
列表。该orders_ids
字段包含不同顺序的列表_id
的对items.sku
(参见 $addToSet
)。
在value.qty
到qty
输入文档的数量字段。
查询agg_alternative_3
集合以验证结果:
该操作返回以下文档:
译者:李冠飞
校对:
由平台组cust_id
并计算value
字段(参见$sum
)。该 value
字段包含price
每个的总计cust_id
。
然后,将输出写入collection agg_alternative_1
。或者,您可以使用 代替。
该阶段仅选择ord_date
大于或等于new Date("2020-03-01")
的那些文档。
由平台组items.sku
,计算每个SKU:
该阶段调整输出文档的形状以反映map-reduce的输出,该输出具有两个字段_id
和 value
。该设置:
value.count
到的尺寸orders_ids
数组。(请参阅)
value.avg
平均每笔订购的数量。(请参阅和)
最后,将输出写入collection agg_alternative_3
。如果现有文档的密钥_id
与新结果相同,则该操作将覆盖现有文档。如果不存在具有相同密钥的文档,则该操作将插入该文档。