2009-10-19 42 views
17

Evet, ben CouchDb Map/Reduce dünyasına giren bir SQL jokeyiyim (sorta).SQL COUNT (*) toplama işlevinin CouchDB eşdeğeri nedir?

Harita:

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

azaltın: Ben aşağıdaki CouchDB veri setleri için COUNT (*) SQL toplayıcı fonksiyonunun eşdeğer nasıl başladığını düşündü düşündüm

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

ama gerçekten ...

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

: böyle bir şey dönen, çalıştı. Bir kayıt eklediğimde, bu sayı çılgınca değişir. Bazen sayı aslında azalır, bu çok şaşırtıcıydı. Yanlış bir şey mi yapıyorum? Belki de nihai tutarlılık kavramını tam olarak anlamadım?

cevap

22

Bu, azaltılmış sonuçlarınızın yeniden azaltıldığı anlamına geliyor. Yani, reduce, her anahtar için bir kereden fazla çağrılır ve daha sonra bu sonuçlarla tekrar çağrılır. senin sadece koymak azaltmak yılında

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

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

Javascript kullanarak, yerleşik kullanıcılar yerine işlevleri azaltın, çok kötü bir performans verecektir. David'in cevabını görün – wallacer

31

: değerleri her zaman bir doküman sayısı böylece sen map işlevini değiştirebilir, Alternatif

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

: Böyle bir reduce fonksiyonu ile bu işleyebilir:

_count

Ayrıca kullanarak bir miktar alabilirsiniz:

_sum

böylece temelde azaltmak: "_sum" veya azaltmak: "_count" ve emin haritanız yayar değer geçerli bir tamsayı

"Built in reduce functions" Bkz (sayısal değer) olduğundan emin olun.

+1

Bu daha iyi bir cevap. Yerleşik işlevler hakkında buraya gönderilen David'i okuyun. – Lander

+0

Bu aslında doğru cevap! –