2013-03-27 100 views
2

例如,這是一個返回一行之和長度的函數:爲什麼couchdb的減少是以這種方式實現的?

function(key, values, rereduce) { 
    var result = {total: 0, count: 0}; 
    for(i=0; i < values.length; i++) { 
    if(rereduce) { 
     result.total = result.total + values[i].total; 
     result.count = result.count + values[i].count; 
    } else { 
     result.total = sum(values); 
     result.count = values.length; 
    } 
    } 
    return(result); 
} 

看起來你必須定義:

  • 減少所有元素的一種方式。
  • 一種分組部分減少(??)

爲什麼這麼奇怪?傳統方法可以描述爲簡單:

reduce = { 
    op: function(accumulated,val){ 
     return {total:accumulated.total + val, count:accumulated.count++}; 
    }, 
    initial: {total:0, count:0} 
} 

它包含足夠的信息來減少整個數組並更新爲新的值...!

+0

除了「這是它的設計方式,現有模式在許多編程語言中具有模擬功能,使其更容易使用」,您在尋找什麼?第一個MapReduce模式在設計時考慮了函數式編程語言。不幸的是,API很有見地。 :) – WiredPrairie 2013-03-27 11:04:34

+0

我正在尋找理解那裏發生了什麼,如果這只是一個風格的問題,或者如果它可能是couchdb如何工作的一部分。 – MaiaVictor 2013-03-27 12:18:02

回答

2

reduce階段是重複的,因爲它使存儲/緩存更容易。您應該想象將函數作爲樹來減少的結果。爲了減少某個連續的節點子集,可以在很大程度上使用預先計算的縮小值(以及一些原始節點值),這樣就不必爲節點內的所有節點下降整個樹/重新計算值查詢範圍。

我希望能夠清楚一點,這很難解釋。

+0

簡潔的解釋。 – sarwar 2013-03-30 16:44:42

相關問題