在本页面
reduce
function 是一个 JavaScript function,它在map-reduce操作期间“减少”到单个 object 与特定 key 关联的所有值。 reduce
function 必须满足各种要求。本教程有助于验证reduce
function 是否符合以下条件:
reduce
function 必须_retject 一个 object,其类型必须与map
function 发出的value
的类型相同。valuesArray
中元素的 order 不应影响reduce
function 的输出。reduce
function 必须是幂等的。
有关reduce
function 的所有要求的列表,请参阅MapReduce或mongo shell 辅助方法db.collection.mapReduce()。
确认输出类型
您可以测试reduce
function 返回的 value 与map
function 发出的 value 的类型相同。
定义一个
reduceFunction1
function,它接受 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
定义一个
reduceFunction2
function,它接受 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
values1
array 和 samplevalues2
array,它们只在 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 } ];
定义一个
reduceFunction2
function,它接受 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。
定义一个
reduceFunction2
function,它接受 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
valuesIdempotent
array,其中包含一个调用reduceFunction2
function 的元素:var valuesIdempotent = [ { count: 1, qty: 5 }, { count: 2, qty: 10 }, reduceFunction2(myKey, [ { count:3, qty: 15 } ] ) ];
定义一个 sample
values1
array,它结合了传递给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 }
译者:李冠飞
校对:
参见