CouchDB - 在reduce步骤

时间:2016-10-07 18:46:54

标签: mapreduce couchdb

我正在尝试在自定义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}"

我想汇总/总和a&的价值。 b对于dateX和dateY,我的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}
        .
        .
        .   

1 个答案:

答案 0 :(得分: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以防止在重新减少的情况下重复执行

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

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