2012-04-09 187 views
2

我有一個返回值作爲數組的地圖功能的數組:CouchDB的減少函數值

emit(doc.created_date, { calories : doc.calories, miles : doc.miles, minutes : doc.minutes, reps : doc.reps, steps : doc.steps, water : doc.water }) 

我想在其上運行的卡路里,英里,分鐘和步驟的總和所有返回值。像

return {"calories":t_cal,"miles":t_mil, "minutes":t_min,"steps":t_step}; 

我已經嘗試了幾個例子沙發維基和其他網站,但我不知道如何訪問值數組。

我得到reduce_overflow_error當我嘗試只是總結的值或循環運行的空當:

for(var i in values) { t_mil = t_mil + values[i].miles } 
+0

你想爲每個單獨的領域的總和?您可能只需要爲每個字段創建單獨的索引。是的,這是超過1個查詢,但這可能是最好的方式去做這件事。 – 2012-04-10 03:26:11

回答

5

我做你正在做的事情很多,所以這是可能的。

您的對象是的一點點超過CouchDB的限制,或者您的代碼中存在一個錯誤。

您可以設置CouchDB配置,query_server_config/reduce_limit = "false"並查看它的外觀。

但是,如果您只積累四項,我不認爲這是一個減少限制問題。總是發生在我身上的是JavaScript問題。例如,向一個字符串添加一個數字會產生一個(較長的)字符串。添加更多數字會使字符串變長和變長。

var old_value = "3" // This is a bad value, perhaps from a map function bug 
var new_value = 5 

new_value = new_value + old_value // I wanted 8, but I got "53" 
new_value = new_value + 2012 // I wanted 2020 but I got "532012" 

對於數組和其他類型會出現類似的問題。

map函數發出與reduce返回的對象相同的東西(對象),您的開局不錯。也許你可以發佈一些你正在使用的代碼。我平時做這樣的事情:

function(keys, vals, rereduce) { 
    // reduce function 
    var result = {'calories':0, 'miles':0, 'minutes':0, 'steps':0} 

    for(var i = 0; i < vals.length; i++) { 
    result.calories += vals[i].calories || 0 
    result.miles += vals[i].miles || 0 
    result.minutes += vals[i].minutes || 0 
    result.steps += vals[i].steps || 0 
    } 

    return result 
} 

注意,減少輸出是完全一樣的地圖輸出,所以這個代碼適用於減少和再減少。

+0

這工作,我可以看到我錯了什麼地方。謝謝 – Milimber 2012-04-10 13:57:49

0

您可以在沒有JS減少的情況下以優雅快速的方式進行操作。使您的地圖功能發出陣列,如emit(doc.created_date, [doc.calories, doc.miles, doc.minutes, doc.reps, doc.steps, doc.water]),然後使用內置的_sum進行縮小。

結果將是一列按總和排列的數組。不太知道,但是CouchDB非常有用的功能。