排除 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:

      1. var reduceFunction1 = function(keyCustId, valuesPrices) {
      2. return Array.sum(valuesPrices);
      3. };
    • 定义 sample array 整数:

      1. var myTestValues = [ 5, 5, 10 ];
    • 使用myTestValues调用reduceFunction1

      1. reduceFunction1('myKey', myTestValues);
    • 验证reduceFunction1返回 integer:

      1. 20
    • 定义一个reduceFunction2 function,它接受 arguments keySKUvaluesCountObjectsvaluesCountObjects是包含两个字段countqty的 array 文档:

      1. var reduceFunction2 = function(keySKU, valuesCountObjects) {
      2. reducedValue = { count: 0, qty: 0 };
      3. for (var idx = 0; idx <; valuesCountObjects.length; idx++) {
      4. reducedValue.count += valuesCountObjects[idx].count;
      5. reducedValue.qty += valuesCountObjects[idx].qty;
      6. }
      7. return reducedValue;
      8. };
    • 定义 sample array 文档:

      1. var myTestObjects = [
      2. { count: 1, qty: 5 },
      3. { count: 2, qty: 10 },
      4. { count: 3, qty: 15 }
      5. ];
    • 使用myTestObjects调用reduceFunction2

      1. reduceFunction2('myKey', myTestObjects);
    • 验证reduceFunction2返回的文档中包含countqty字段:

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

    确保对映射值的 Order 不敏感

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

    • 定义 sample values1 array 和 sample values2 array,它们只在 array 元素的 order 中有所不同:

      1. var values1 = [
      2. { count: 1, qty: 5 },
      3. { count: 2, qty: 10 },
      4. { count: 3, qty: 15 }
      5. ];
      6. var values2 = [
      7. { count: 3, qty: 15 },
      8. { count: 1, qty: 5 },
      9. { count: 2, qty: 10 }
      10. ];
    • 定义一个reduceFunction2 function,它接受 arguments keySKUvaluesCountObjectsvaluesCountObjects是包含两个字段countqty的 array 文档:

      1. var reduceFunction2 = function(keySKU, valuesCountObjects) {
      2. reducedValue = { count: 0, qty: 0 };
      3. for (var idx = 0; idx < valuesCountObjects.length; idx++) {
      4. reducedValue.count += valuesCountObjects[idx].count;
      5. reducedValue.qty += valuesCountObjects[idx].qty;
      6. }
      7. return reducedValue;
      8. };
    • 先使用values1然后使用values2调用reduceFunction2

      1. reduceFunction2('myKey', values1);
      2. reduceFunction2('myKey', values2);
    • 验证reduceFunction2返回相同的结果:

      1. { "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 文档:

      1. var reduceFunction2 = function(keySKU, valuesCountObjects) {
      2. reducedValue = { count: 0, qty: 0 };
      3. for (var idx = 0; idx <; valuesCountObjects.length; idx++) {
      4. reducedValue.count += valuesCountObjects[idx].count;
      5. reducedValue.qty += valuesCountObjects[idx].qty;
      6. }
      7. return reducedValue;
      8. };
    • 定义 sample key:

      1. var myKey = 'myKey';
    • 定义 sample valuesIdempotent array,其中包含一个调用reduceFunction2 function 的元素:

      1. var valuesIdempotent = [
      2. { count: 1, qty: 5 },
      3. { count: 2, qty: 10 },
      4. reduceFunction2(myKey, [ { count:3, qty: 15 } ] )
      5. ];
    • 定义一个 sample values1 array,它结合了传递给reduceFunction2的值:

      1. var values1 = [
      2. { count: 1, qty: 5 },
      3. { count: 2, qty: 10 },
      4. { count: 3, qty: 15 }
      5. ];
    • 首先使用myKeyvaluesIdempotent调用reduceFunction2,然后使用myKeyvalues1调用reduceFunction2

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

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

    译者:李冠飞

    校对:

    参见

    原文 - Troubleshoot the Reduce Function