2009-10-19 73 views
17

是的,我是一個SQL騎師(排序)進入CouchDb Map/Reduce世界。我想我已經想通了COUNT(*)SQL聚合函數的等效CouchDB的數據集具有以下如何:什麼是SQL COUNT(*)聚合函數的CouchDB等價物?

地圖:

function(doc) { 
    emit(doc.name, doc); 
} 

減少:

function(keys, values, rereduce){ 
    return values.length; 
} 

而且我認爲他工作,返回類似:

"super fun C" 2 
"super fun D" 2 
"super fun E" 2 
"super fun F" 18 

...但不是真的。當我添加一條記錄時,這個數字變化很大。有時計數實際上減少了,這非常令人驚訝。難道我做錯了什麼?也許我不完全理解最終一致性的概念?

回答

22

看起來你的減少結果正在被重新減少。也就是說,reduce被稱爲每個鍵不止一次,然後再次調用這些結果。您可以處理與reduce功能是這樣的:

function(keys, values, rereduce) { 
    if (rereduce) { 
    return sum(values); 
    } else { 
    return values.length; 
    } 
} 

或者,你可以改變map功能,以便值總是文檔計數:

// map 
function(doc) { 
    emit(doc.name, 1); 
} 

// reduce 
function(keys, values, rereduce) { 
    return sum(values); 
} 
+0

使用JavaScript減少功能,而不是內置的功能會給你非常糟糕的表現。見大衛的回答 – wallacer 2014-06-09 22:38:08

31

在您的降低只是把:

_count

您也可以使用得到一筆:

_sum

所以基本上減少:「_sum」或減少「_count」,並確保您的地圖發出的值是一個有效的整數(數值)

"Built in reduce functions"

+1

這是更好的答案。閱讀David在這裏發佈的有關內置函數的鏈接。 – Lander 2013-06-04 08:33:07

+0

這實際上是正確答案! – 2013-09-23 01:55:05

相關問題