एक कम फ़ंक्शन को एक बार कुंजी और सभी संगत मानों . के साथ कॉल किया जा सकता है (लेकिन केवल अगर कुंजी के लिए एकाधिक मान हैं - कुंजी के लिए केवल 1 मान होने पर इसे बिल्कुल भी नहीं कहा जाएगा)।
इसे कई बार भी कहा जा सकता है, हर बार एक कुंजी के साथ और केवल संबंधित मानों का सबसेट , और पिछला उस कुंजी के परिणामों को कम करता है। इस परिदृश्य को फिर से कम करें . कहा जाता है . पुन:कम करने का समर्थन करने के लिए, आपका कम करें कार्य निष्क्रिय होना चाहिए।
एक निष्क्रिय कम करने के कार्य में दो प्रमुख विशेषताएं हैं:
- वापसी मूल्य कम करें फ़ंक्शन का मानों के समान प्रारूप में होना चाहिए इसमें लगता है। इसलिए, यदि आपका कम फ़ंक्शन स्ट्रिंग्स की एक सरणी स्वीकार करता है, तो फ़ंक्शन को एक स्ट्रिंग वापस करनी चाहिए। यदि यह कई गुणों वाली वस्तुओं को स्वीकार करता है, तो उसे उन्हीं गुणों वाली वस्तु को वापस करना चाहिए। यह सुनिश्चित करता है कि पिछले कम के परिणाम के साथ कॉल किए जाने पर फ़ंक्शन टूटता नहीं है।
- मानों की संख्या के आधार पर अनुमान न लगाएं यह लेता है। इसकी गारंटी नहीं है कि
values
पैरामीटर में सभी शामिल हैं दी गई कुंजी के लिए मान। तोvalues.length
. का उपयोग कर रहे हैं गणना में बहुत जोखिम भरा है और इससे बचना चाहिए।
अपडेट करें: हाल ही में मोंगोडीबी रिलीज पर नीचे दिए गए दो चरणों की आवश्यकता नहीं है (या यहां तक कि संभव है, मैंने जांच नहीं की है)। यह अब आपके लिए इन चरणों को संभाल सकता है, यदि आप मानचित्र-कम करने के विकल्पों में आउटपुट संग्रह निर्दिष्ट करते हैं:
{ out: { reduce: "tempResult" } }
यदि आपका कम करें फ़ंक्शन बेकार है, तो आपको मानचित्र-कई संग्रहों को कम करने में कोई समस्या नहीं होनी चाहिए। बस प्रत्येक संग्रह के परिणामों को फिर से कम करें:
चरण 1
प्रत्येक आवश्यक संग्रह पर नक्शा-कम करें और परिणामों को एकल, अस्थायी संग्रह में सहेजें। आप फ़ाइनलाइज़ फ़ंक्शन का उपयोग करके परिणामों को संग्रहीत कर सकते हैं:
finalize = function (key, value) {
db.tempResult.save({ _id: key, value: value });
}
db.someCollection.mapReduce(map, reduce, { finalize: finalize })
db.anotherCollection.mapReduce(map, reduce, { finalize: finalize })
चरण 2
उसी कम फ़ंक्शन का उपयोग करके . अस्थायी संग्रह पर एक और नक्शा-कम करें चलाएं . मैप फ़ंक्शन एक साधारण फ़ंक्शन है जो अस्थायी संग्रह से कुंजियों और मानों का चयन करता है:
map = function () {
emit(this._id, this.value);
}
db.tempResult.mapReduce(map, reduce)
यह दूसरा मैप-रिड्यूस मूल रूप से री-रिड्यूस है और इससे आपको वह परिणाम मिलेगा जो आपको चाहिए।