在本页面
reduce function 是一个 JavaScript function,它在map-reduce操作期间“减少”到单个 object 与特定 key 关联的所有值。 reduce function 必须满足各种要求。本教程有助于验证reduce function 是否符合以下条件:
reducefunction 必须_retject 一个 object,其类型必须与mapfunction 发出的value的类型相同。valuesArray中元素的 order 不应影响reducefunction 的输出。reducefunction 必须是幂等的。
有关reduce function 的所有要求的列表,请参阅MapReduce或mongo shell 辅助方法db.collection.mapReduce()。
确认输出类型
您可以测试reduce function 返回的 value 与map function 发出的 value 的类型相同。
定义一个
reduceFunction1function,它接受 argumentskeyCustId和valuesPrices。valuesPrices是整数的 array:var reduceFunction1 = function(keyCustId, valuesPrices) { return Array.sum(valuesPrices); };定义 sample array 整数:
var myTestValues = [ 5, 5, 10 ];使用
myTestValues调用reduceFunction1:reduceFunction1('myKey', myTestValues);验证
reduceFunction1返回 integer:20定义一个
reduceFunction2function,它接受 argumentskeySKU和valuesCountObjects。valuesCountObjects是包含两个字段count和qty的 array 文档:var reduceFunction2 = function(keySKU, valuesCountObjects) { reducedValue = { count: 0, qty: 0 }; for (var idx = 0; idx <; valuesCountObjects.length; idx++) { reducedValue.count += valuesCountObjects[idx].count; reducedValue.qty += valuesCountObjects[idx].qty; } return reducedValue; };定义 sample array 文档:
var myTestObjects = [ { count: 1, qty: 5 }, { count: 2, qty: 10 }, { count: 3, qty: 15 } ];使用
myTestObjects调用reduceFunction2:reduceFunction2('myKey', myTestObjects);验证
reduceFunction2返回的文档中包含count和qty字段:{ "count" : 6, "qty" : 30 }
确保对映射值的 Order 不敏感
reduce function 以key和values array 为参数。您可以测试reduce function 的结果不依赖于values array 中元素的 order。
定义 sample
values1array 和 samplevalues2array,它们只在 array 元素的 order 中有所不同:var values1 = [ { count: 1, qty: 5 }, { count: 2, qty: 10 }, { count: 3, qty: 15 } ]; var values2 = [ { count: 3, qty: 15 }, { count: 1, qty: 5 }, { count: 2, qty: 10 } ];定义一个
reduceFunction2function,它接受 argumentskeySKU和valuesCountObjects。valuesCountObjects是包含两个字段count和qty的 array 文档:var reduceFunction2 = function(keySKU, valuesCountObjects) { reducedValue = { count: 0, qty: 0 }; for (var idx = 0; idx < valuesCountObjects.length; idx++) { reducedValue.count += valuesCountObjects[idx].count; reducedValue.qty += valuesCountObjects[idx].qty; } return reducedValue; };先使用
values1然后使用values2调用reduceFunction2:reduceFunction2('myKey', values1); reduceFunction2('myKey', values2);验证
reduceFunction2返回相同的结果:{ "count" : 6, "qty" : 30 }
确保减少 Function Idempotence
因为 map-reduce 操作可能会为同一个 key 多次调用reduce,并且不会为工作集中的 key 的单个实例调用reduce,reduce function 必须 return 与从该值发出的 value 相同类型的 value。 map function。您可以测试reduce function process“减少”值而不影响最终的 value。
定义一个
reduceFunction2function,它接受 argumentskeySKU和valuesCountObjects。valuesCountObjects是包含两个字段count和qty的 array 文档:var reduceFunction2 = function(keySKU, valuesCountObjects) { reducedValue = { count: 0, qty: 0 }; for (var idx = 0; idx <; valuesCountObjects.length; idx++) { reducedValue.count += valuesCountObjects[idx].count; reducedValue.qty += valuesCountObjects[idx].qty; } return reducedValue; };定义 sample key:
var myKey = 'myKey';定义 sample
valuesIdempotentarray,其中包含一个调用reduceFunction2function 的元素:var valuesIdempotent = [ { count: 1, qty: 5 }, { count: 2, qty: 10 }, reduceFunction2(myKey, [ { count:3, qty: 15 } ] ) ];定义一个 sample
values1array,它结合了传递给reduceFunction2的值:var values1 = [ { count: 1, qty: 5 }, { count: 2, qty: 10 }, { count: 3, qty: 15 } ];首先使用
myKey和valuesIdempotent调用reduceFunction2,然后使用myKey和values1调用reduceFunction2:reduceFunction2(myKey, valuesIdempotent); reduceFunction2(myKey, values1);验证
reduceFunction2返回相同的结果:{ "count" : 6, "qty" : 30 }
译者:李冠飞
校对:
参见