排除 Reduce Function 问题

在本页面

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 的所有要求的列表,请参阅MapReducemongo shell 辅助方法db.collection.mapReduce()

确认输出类型

您可以测试reduce function 返回的 value 与map function 发出的 value 的类型相同。

  • 定义一个reduceFunction1 function,它接受 arguments keyCustIdvaluesPricesvaluesPrices是整数的 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,它接受 arguments keySKUvaluesCountObjectsvaluesCountObjects是包含两个字段countqty的 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返回的文档中包含countqty字段:

    { "count" : 6, "qty" : 30 }

确保对映射值的 Order 不敏感

reduce function 以keyvalues array 为参数。您可以测试reduce function 的结果不依赖于values array 中元素的 order。

  • 定义 sample values1 array 和 sample values2 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,它接受 arguments keySKUvaluesCountObjectsvaluesCountObjects是包含两个字段countqty的 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 的单个实例调用reducereduce function 必须 return 与从该值发出的 value 相同类型的 value。 map function。您可以测试reduce function process“减少”值而不影响最终的 value。

  • 定义一个reduceFunction2 function,它接受 arguments keySKUvaluesCountObjectsvaluesCountObjects是包含两个字段countqty的 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 }
    ];
  • 首先使用myKeyvaluesIdempotent调用reduceFunction2,然后使用myKeyvalues1调用reduceFunction2

    reduceFunction2(myKey, valuesIdempotent);
    reduceFunction2(myKey, values1);
  • 验证reduceFunction2返回相同的结果:

    { "count" : 6, "qty" : 30 }

译者:李冠飞

校对:

最后更新于