在本页面
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 }
译者:李冠飞
校对:
参见
