MongoDB文档翻译-调试Reduce函数

英文原文地址:https://docs.mongodb.com/v3.2/tutorial/troubleshoot-reduce-function/
本文章属个人翻译,作个人学习之用,如有雷同,纯属巧合。如有错误之处,欢迎指正。

调试Reduce函数

reduce函数是一个javascript函数,在map-rduce操作过程中把与一个特定键管理的所有值归约为单个对象。reduce函数必须满足多个要求,该教程旨在于验证reduce满足以下要求:

  • reduce函数必须返回一个对象,其类型必须与map函数产生的value的类型相同。
  • valuesArray中的元素顺序不应该影响reduce函数的输出。
  • reduce函数必须是幂等的。

对于reduce函数的所有要求,请查看mapReduce,或者mongoshell帮助函数db.collection.mapReduce()

确认输出类型

你可以测试reduce函数返回的值与map函数产生值的类型相同。

  1. 定义一个以keyCustIdvaluesPrice作为参数的reduceFunction1函数,valuesPrices是一个整数数组:

    var reduceFunction1 = function(keyCustId, valuesPrices) {
                              return Array.sum(valuesPrices);
                          };
  2. 定义一个整数数组样本:

    var myTestValues = [ 5, 5, 10 ];
  3. myTestValues调用myTestValues

    reduceFunction1('myKey', myTestValues);
  4. 验证`reduceFunction1,返回一个整数:

    20
  5. 定义一个以keySKUvaluesCountObjects作为参数的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;
                          };
  6. 定义一个文档数组样本:

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

    reduceFunction2('myKey', myTestObjects);
  8. 验证reduceFunction2,返回的文档仅包含count和qty字段:

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

确保对映射值的顺序不敏感

reduce函数把一个键和值数组作为它的参数。你可以测试reduce函数的结果不依赖于值数组的元素顺序。

  1. 定义一个样例values1数组和样例values2数组,它们只是元素顺序不同:

    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 }
                  ];
  2. 定义一个以keySKUvaluesCountObjects作为参数的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;
                          };
  3. 依次用values1和values2调用reduceFunction2

    reduceFunction2('myKey', values1);
    reduceFunction2('myKey', values2);
  4. 验证reducetFunction2返回同样的结果:

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

验证Reduct函数的幂等性

由于map-reduce操作可能对同样的键调用多次reduce,不会只对工作集中的一个键调用一次,reduce函数在不同次数调用与一次调用,返回的值应该是一样的。你可以测试reduce函数处理一个已经归约的值,而不会影响最终的值。

  1. 定义一个以keySKUvaluesCountObjects作为参数的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;
                          };
  2. 定义一个样例key:

    var myKey = 'myKey';
  3. 定义一个样例数组:valuesIdempotent,包含reduceFunction2函数的调用结果:

    var valuesIdempotent = [
                             { count: 1, qty: 5 },
                             { count: 2, qty: 10 },
                             reduceFunction2(myKey, [ { count:3, qty: 15 } ] )
                           ];
  4. 定义一个样例数组values1:包含传递给reduceFunction2的值:

    var values1 = [
                    { count: 1, qty: 5 },
                    { count: 2, qty: 10 },
                    { count: 3, qty: 15 }
                  ];
  5. 调用reduceFunction2,第一次用myKey和valuesIdempotent,第二次用myKey和values1:

    reduceFunction2(myKey, valuesIdempotent);
    reduceFunction2(myKey, values1);
  6. 验证reducetFunction2返回同样的结果:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值