【问题标题】:CouchDB - aggregate multiple values in the reduce stepCouchDB - 在减少步骤中聚合多个值
【发布时间】:2017-02-16 20:25:21
【问题描述】:

我正在尝试在自定义 reduce 函数(启用 rereduce)中聚合从我的地图发出的多个值,但我在结果中得到空值,除了我看到 0 的少数数据点。非常感谢任何帮助。谢谢

我发出的数据格式如下:

Key:"dateX" Values:"{'a':435, 'b':5645}"
Key:"dateX" Values:"{'a':8451, 'b':9245}"
Key:"dateX" Values:"{'a':352, 'b':450}"

Key:"dateY" Values:"{'a':5675, 'b':1245}"
Key:"dateY" Values:"{'a':4455, 'b':620}"

我想对 dateX 和 dateY 的 a & b 的值进行聚合/求和,我的 map-reduce 是:

"map": "function(doc){emit(doc.logDate, {'a': doc.a, 'b': doc.b} );}",

"reduce": "function(key, values, rereduce) { 
                    var total = {tA:0, tB:0}; 
                    if(rereduce){ 
                        for(i=0; i<values.length; i++)
                        { 
                            total.tA += values[i].a; 
                            total.tB += values[i].b;
                        } 
                        return total;
                    } 
                    total.tA = sum(values.a); 
                    total.tB = sum(values.b); 
                    return total; }"
------------------------
Results:
dateX        {tA: 0, tB: 0} 
dateY        {tA: null, tB: null}   
dateZ        {tA: null, tB: null}
        .
        .
        .   

【问题讨论】:

    标签: mapreduce couchdb


    【解决方案1】:

    首先,函数 sum 需要一个数组作为参数,而不是未定义的 values.a,所以你可以试试

    total.tA = sum(values.map(function (value) {return value.a}));
    total.tB = sum(values.map(function (value) {return value.b}));
    

    或者类似的东西

    values.reduce(function (t, value) {
        t.tA += value.a;
        t.tB += value.b;
        return t;
    }, total);
    

    此外,当启用 rereduce 标志时,意味着 reduce 函数适用于已经减少的值,所以

    for (i=0; i < values.length; i++) { 
        total.tA += values[i].tA; //not a
        total.tB += values[i].tB; //not b
    }
    

    另外,您应该添加else 以防止在 rereduce 情况下重复执行

    if (rereduce) {
       //
    } else {
      //
    }
    

    http://guide.couchdb.org/editions/1/en/views.html#reduce

    【讨论】:

    • 谢谢@the4lt 我会试试这个,对于我的问题,我通过制作 {tA:0, tB:0}; 来解决它以与“{'a':4455, 'b':620}”相同的格式,这样reduce方法可以正常工作,我猜它不会触发rereduce,所以我可以用for循环求和并避免sum( ) 函数进行聚合。
    猜你喜欢
    • 2016-10-31
    • 2021-10-03
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 2018-05-22
    • 1970-01-01
    • 2021-08-03
    • 1970-01-01
    相关资源
    最近更新 更多