2011-08-31 108 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]; 
     } 
    } 
    } 
}