我试图在自定义减少函数(减少启用)中聚合从我的地图发出的多个值,但我在结果中得到空值,除了我看到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}
.
.
.
首先,函数sum需要一个数组作为参数,而不是值。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);
另外,当启用reduce标志时意味着reduce函数可以使用已经减少的值,因此
for (i=0; i < values.length; i++) {
total.tA += values[i].tA; //not a
total.tB += values[i].tB; //not b
}
另外,您应该添加else
以防止在reduce case中重复执行
if (rereduce) {
//
} else {
//
}
http://guide.couchdb.org/editions/1/en/views.html减少