Reduce函数的问题排除


进入MongoDB中文手册(4.2版本)目录

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

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

有关该reduce功能的所有要求的列表,请参见mapReduce或mongo shell的帮助器方法 db.collection.mapReduce()

注意
在4.2.1版本开始,MongoDB的不赞成map,reduce和finalize函数使用scope(即使用JavaScript的BSON类型15)。要限制变量的范围,请改用scope参数。

1 确认输出类型

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

  1. 定义一个接受参数keyCustId和valuesPrices的reduceFunction1函数 。valuesPrices是整数数组:
var reduceFunction1 = function(keyCustId, valuesPrices) {
                          return Array.sum(valuesPrices);
                      };
  1. 定义一个整数样本数组
var myTestValues = [ 5, 5, 10 ];
  1. 调用具有myTestValues的reduceFunction1:
reduceFunction1('myKey', myTestValues);
  1. 验证reduceFunction1返回的整数:
20
  1. 定义一个接受参数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;
                      };
  1. 定义文档样本数组:
var myTestObjects = [
                      { count: 1, qty: 5 },
                      { count: 2, qty: 10 },
                      { count: 3, qty: 15 }
                    ];
  1. 调用具有myTestObjects的reduceFunction2:
reduceFunction2('myKey', myTestObjects);
  1. 使用count和qty字段验证reduceFunction2返回的文档 :
{ "count" : 6, "qty" : 30 }

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

reduce函数以key和values数组作为参数。您可以测试reduce函数的结果是否不依赖于values数组中元素的顺序。

  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 }
              ];
  1. 定义一个接受参数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;
                      };
  1. reduceFunction2首先调用values1,然后使用 values2:
reduceFunction2('myKey', values1);
reduceFunction2('myKey', values2);
  1. 验证reduceFunction2返回结果是否相同:
{ "count" : 6, "qty" : 30 }

3 确保Reduce函数的幂等性

由于map-reduce操作可能会为同一键多次调用一个reduce,而不会为工作集中的一个键的单个实例调用一个reduce ,因此reduce函数必须返回与map函数发出的值相同类型的值。您可以测试reduce函数处理了“被归纳”的值而不会影响最终值。

  1. 定义一个接受参数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;
                      };
  1. 定义一个样本键:
var myKey = 'myKey';
  1. 定义一个样本数组valuesIdempotent,其中包含一个元素,该元素是对该reduceFunction2函数的调用:
var valuesIdempotent = [
                         { count: 1, qty: 5 },
                         { count: 2, qty: 10 },
                         reduceFunction2(myKey, [ { count:3, qty: 15 } ] )
                       ];
  1. 定义一个样本数组values1,该数组组合传递给reduceFunction2的值 :
var values1 = [
                { count: 1, qty: 5 },
                { count: 2, qty: 10 },
                { count: 3, qty: 15 }
              ];
  1. 首先使用myKey和valuesIdempotent调用reduceFunction2,然后使用myKey和values1调用:
reduceFunction2(myKey, valuesIdempotent);
reduceFunction2(myKey, values1);
  1. 验证reduceFunction2返回的结果是否相同:
{ "count" : 6, "qty" : 30 }


进入MongoDB中文手册(4.2版本)目录

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值