归约功能故障排除
在本页面
reduce
函数是一种 JavaScript 函数,它在map-reduce操作期间将与特定键关联的所有值“还原”到单个对象。 reduce
函数必须满足各种要求。本教程有助于验证reduce
函数满足以下条件:
-
reduce
函数必须返回* type *必须与map
函数发出的value
的类型“相同”的对象。 -
valuesArray
中元素的 Sequences 不应影响reduce
函数的输出。 -
reduce
函数必须是幂等。
有关reduce
函数的所有要求的列表,请参见mapReduce或mongo shell 帮助器方法db.collection.mapReduce()。
确认输出类型
您可以测试reduce
函数返回的值与map
函数发出的值的类型相同。
- 定义一个带有参数
keyCustId
和valuesPrices
的reduceFunction1
函数。valuesPrices
是整数数组:
var reduceFunction1 = function(keyCustId, valuesPrices) {
return Array.sum(valuesPrices);
};
- 定义一个整数 samples 数组:
var myTestValues = [ 5, 5, 10 ];
- 用
myTestValues
调用reduceFunction1
:
reduceFunction1('myKey', myTestValues);
- 验证
reduceFunction1
返回的是整数:
20
- 定义一个带有参数
keySKU
和valuesCountObjects
的reduceFunction2
函数。valuesCountObjects
是包含两个字段count
和qty
的文档数组:
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;
};
- 定义文档 samples 数组:
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 }
确保对 Map 值的 Sequences 不敏感
reduce
函数将key
和values
数组作为其参数。您可以测试reduce
函数的结果不取决于values
数组中元素的 Sequences。
- 定义一个 samples
values1
数组和一个 samplesvalues2
数组,只是数组元素的 Sequences 不同:
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 }
];
- 定义一个带有参数
keySKU
和valuesCountObjects
的reduceFunction2
函数。valuesCountObjects
是包含两个字段count
和qty
的文档数组:
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 }
确保减少功能幂等
因为 map-reduce 操作可能会为同一键多次调用reduce
,并且不会为工作集中的键的单个实例调用reduce
,所以reduce
函数必须返回与发出的值相同类型的值来自map
函数。您可以测试reduce
函数处理“减少”的值而不影响* final *值。
- 定义一个带有参数
keySKU
和valuesCountObjects
的reduceFunction2
函数。valuesCountObjects
是包含两个字段count
和qty
的文档数组:
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;
};
- 定义一个 samples 键:
var myKey = 'myKey';
- 定义一个示例
valuesIdempotent
数组,其中包含一个元素,该元素是对reduceFunction2
函数的调用:
var valuesIdempotent = [
{ count: 1, qty: 5 },
{ count: 2, qty: 10 },
reduceFunction2(myKey, [ { count:3, qty: 15 } ] )
];
- 定义一个示例
values1
数组,该数组合并传递给reduceFunction2
的值:
var values1 = [
{ count: 1, qty: 5 },
{ count: 2, qty: 10 },
{ count: 3, qty: 15 }
];
- 首先使用
myKey
和valuesIdempotent
然后再使用myKey
和values1
调用reduceFunction2
:
reduceFunction2(myKey, valuesIdempotent);
reduceFunction2(myKey, values1);
- 验证
reduceFunction2
返回的结果相同:
{ "count" : 6, "qty" : 30 }