2013-10-08 4 views
5

कम करें मैं मैंगो शैल में मैंगोडब पर मानचित्र को कम करने की कोशिश कर रहा हूं। किसी कारण से, कम चरण में, मुझे एक ही कुंजी (एकल की बजाय) के लिए कई कॉल मिलती हैं, इसलिए मुझे गलत परिणाम मिलते हैं। मैं इस डोमेन में एक विशेषज्ञ नहीं हूं, इसलिए शायद मैं कुछ बेवकूफ गलती कर रहा हूं। किसी भी मदद की सराहना की।मोंगोडब मानचित्र में एक ही कुंजी के साथ कई बार कम किया जाता है-

धन्यवाद।

मैं 10000 दस्तावेज बना रहा हूं:

यह मेरा छोटा सा उदाहरण है

var i = 0; 
db.docs.drop(); 
while (i < 10000) { 
    db.docs.insert({text:"line " + i,index:i}); 
    i++; 
} 

तो मैं कर रहा हूँ नक्शे-को कम मॉड्यूल 10 के आधार पर (ताकि मैं प्रत्येक में 1000 प्राप्त करने के लिए सिवाय "

{ 
    "results" : [ 
     { 
      "_id" : 0, 
      "value" : 21 
     }, 
     { 
      "_id" : 1, 
      "value" : 21 
     }, 
     { 
      "_id" : 2, 
      "value" : 21 
     }, 
     { 
      "_id" : 3, 
      "value" : 21 
     }, 
     { 
      "_id" : 4, 
      "value" : 21 
     }, 
     { 
      "_id" : 5, 
      "value" : 21 
     }, 
     { 
      "_id" : 6, 
      "value" : 21 
     }, 
     { 
      "_id" : 7, 
      "value" : 21 
     }, 
     { 
      "_id" : 8, 
      "value" : 21 
     }, 
     { 
      "_id" : 9, 
      "value" : 21 
     } 
    ], 
    "timeMillis" : 76, 
    "counts" : { 
     "input" : 10000, 
     "emit" : 10000, 
     "reduce" : 500, 
     "output" : 10 
    }, 
    "ok" : 1, 
} 
: बाल्टी ")

db.docs.mapReduce(
    function() { 
     emit(this.index%10,1); 
    }, 
    function(key,values) { 
     return values.length; 
    }, 
    { 
    out : {inline : 1} 
    } 
); 

हालांकि, परिणामों के रूप में मैं निम्नलिखित मिल

उत्तर

6

मानचित्र/घटा अनिवार्य रूप से एक पुनरावर्ती ऑपरेशन है।

MongoDB एक ही कुंजी के लिए एक बार से reduce समारोह अधिक आह्वान कर सकते हैं: विशेष रूप से, documented requirements for the reduce function इस कथन को शामिल। इस मामले में, उस कुंजी के लिए reduce फ़ंक्शन से पिछला आउटपुट उस कुंजी के अगले reduce फ़ंक्शन आमंत्रण के इनपुट मानों में से एक बन जाएगा।

इसलिए, आपको उम्मीद करनी होगी कि इनपुट केवल उस नंबर की संख्या है जिसे पिछले आमंत्रण द्वारा गिना गया था। निम्नलिखित कोड है कि वास्तव में मूल्यों को जोड़कर:

db.docs.mapReduce(
    function() { emit(this.index % 10, 1); }, 
    function(key,values) { return Array.sum(values); }, 
    { out : {inline : 1} }); 

अब, emit(key, 1) एक तरह से और अधिक समझ में आता है, क्योंकि 1 अब तो बस किसी भी सरणी को भरने के लिए इस्तेमाल किया संख्या है, लेकिन अपने मूल्य माना जाता है।

एक साइडेनोट के रूप में, ध्यान दें कि यह कितना खतरनाक है: छोटे डेटासेट के लिए, सही परिणाम दुर्घटना से दिया जा सकता है, क्योंकि इंजन ने एक समानांतरता का फैसला नहीं किया होगा।

+0

बहुत धन्यवाद। मैंने इसे दस्तावेज में याद किया। – eran

+0

हाँ, नक्शा/कम एक्सएमएल की तरह थोड़ा है: यह आसान दिखता है, लेकिन किसी भी तरह यह भ्रमित है और इसमें नुकसान का गुच्छा है: / – mnemosyn

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