归约功能故障排除

在本页面

reduce函数是一种 JavaScript 函数,它在map-reduce操作期间将与特定键关联的所有值“还原”到单个对象。 reduce函数必须满足各种要求。本教程有助于验证reduce函数满足以下条件:

有关reduce函数的所有要求的列表,请参见mapReducemongo shell 帮助器方法db.collection.mapReduce()

确认输出类型

您可以测试reduce函数返回的值与map函数发出的值的类型相同。

var reduceFunction1 = function(keyCustId, valuesPrices) {
                          return Array.sum(valuesPrices);
                      };
var myTestValues = [ 5, 5, 10 ];
reduceFunction1('myKey', myTestValues);
20
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;
                      };
var myTestObjects = [
                      { count: 1, qty: 5 },
                      { count: 2, qty: 10 },
                      { count: 3, qty: 15 }
                    ];
reduceFunction2('myKey', myTestObjects);
{ "count" : 6, "qty" : 30 }

确保对 Map 值的 Sequences 不敏感

reduce函数将keyvalues数组作为其参数。您可以测试reduce函数的结果不取决于values数组中元素的 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 }
              ];
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;
                      };
reduceFunction2('myKey', values1);
reduceFunction2('myKey', values2);
{ "count" : 6, "qty" : 30 }

确保减少功能幂等

因为 map-reduce 操作可能会为同一键多次调用reduce,并且不会为工作集中的键的单个实例调用reduce,所以reduce函数必须返回与发出的值相同类型的值来自map函数。您可以测试reduce函数处理“减少”的值而不影响* final *值。

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;
                      };
var myKey = 'myKey';
var valuesIdempotent = [
                         { count: 1, qty: 5 },
                         { count: 2, qty: 10 },
                         reduceFunction2(myKey, [ { count:3, qty: 15 } ] )
                       ];
var values1 = [
                { count: 1, qty: 5 },
                { count: 2, qty: 10 },
                { count: 3, qty: 15 }
              ];
reduceFunction2(myKey, valuesIdempotent);
reduceFunction2(myKey, values1);
{ "count" : 6, "qty" : 30 }
首页