2011-08-31 103 views
4

我不知道这是否真的rereduce,但这就是为什么我在这里。Couchdb rereduce的理解和总结

我有这样的:

“afrikan” ID:f6733302df85ac109397f4b6030005bf [1,2]

“afrikan” ID:f6733302df85ac109397f4b6030006d1 [1,3]

“afrikan” ID:f6733302df85ac109397f4b6030012b6 [2 ,4]

“中国” ID:f6733302df85ac109397f4b6030012eb 1

“中国” ID:f6733302df85ac109397f4b603001d 87 1

我知道如何计算总和,如果该值不是一个数组(如在 中文)。但我无法设法将数组中的值加起来,结果如下:“afrikan”“02,41,31,2”

还有一个问题:有没有办法将所有值不管 的钥匙?

查看代码:

function(doc) { 
    if(doc.food) { 
    emit(doc.food, doc.type); 
    } 
} 

减少代码:

function(keys,values,rereduce) 
{ 

return sum(values); 

} 

谢谢了很多:)

UPDATE:

我发现CouchDB的答案。

下面是代码:

function(doc) { 
if(doc.food) { 
if(doc.type.length>1) { 
doc.type.forEach(function(tag) { 
emit(doc.food,tag); 
}); 
}else { 
emit(doc.food,doc.type); 
} 
} 
} 

减少:

function(keys,values) { 
return sum(values); 
} 

回答

2

你的理由 “02,41,31,2”,是因为JavaScript的一个号码+一个数组转换成串。这很奇怪,但是是真的。

> 0 + [2, 4] + [1, 3] + [1, 2] 
'02,41,31,2' 

> sum([0, [2, 4], [1, 3], [1, 2]]) // Same result 
'02,41,31,2' 

我认为你不需要担心rereduce。只需将每个值加在一起。如果它是一个数组,则添加数组中的所有值。

function(keys, values, rereduce) 
{ 
    var total = 0; 
    var i, j; 

    for(i = 0; i < values.length; i++) { 
    if(typeof values[i] == "number") { 
     total = total + values[i]; 
    } 

    else { 
     for(j = 0; j < values[i].length; j++) { 
     total = total + values[i][j]; 
     } 
    } 
    } 
}