2009-10-19 10 views
17

हाँ, मैं एक एसक्यूएल जॉकी (सॉर्टा) हूं जो कॉच डीबी मानचित्र/दुनिया को कम करता है। मैंने सोचा कि मैं पता लगा था कि कैसे निम्नलिखित के साथ CouchDB डेटासेट के लिए COUNT (*) एसक्यूएल एग्रीगेटर समारोह के बराबर: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

जावास्क्रिप्ट का उपयोग करके अंतर्निहित कार्यों के बजाय कार्यों को कम करना आपको बहुत खराब प्रदर्शन देगा। डेविड का जवाब देखें – wallacer

31

अपने को कम बस डाल में:

_count

तुम भी राशि का उपयोग कर प्राप्त कर सकते हैं:

012,

_sum

तो मूल रूप से कम करने के लिए: "_sum" या कम करने: "_count" और सुनिश्चित करें कि मान अपने नक्शे का उत्सर्जन करता है एक मान्य पूर्णांक (संख्यात्मक मान)

"Built in reduce functions" देखें है या नहीं।

+1

यह बेहतर उत्तर है। बिल्ट-इन फ़ंक्शंस के बारे में यहां पोस्ट किए गए लिंक को पढ़ें। – Lander

+0

यह वास्तव में सही जवाब है! –

संबंधित मुद्दे