मुझे लगता है कि मैंने समस्या का पता लगा लिया है। निम्नलिखित इनपुट डेटा पर विचार करें:
{_id: 1, characters: ""}
{_id: 2, characters: "a, b, c"}
{_id: 3, characters: "a, b, c"}
> db.collection.mapReduce(map, reduce, {out: { inline : 1}})
"exception: reduce -> multiple not supported yet"
यह त्रुटि संदेश इंगित करता है कि वर्तमान में MR का उपयोग मानों की एक सरणी को वापस करने के लिए नहीं किया जा सकता है। यदि आप अपने कम करने के कार्य पर एक नज़र डालते हैं:
reduce = function(key, values) {
return values;
}
"मान" कुंजी द्वारा समूहीकृत "सरणी। लम्बाई" की एक सरणी होगी। चूंकि कुंजी "ए, बी, सी" को दो बार उत्सर्जित किया गया था (एक ही तर्क "" के साथ कई दस्तावेजों के लिए अनुसरण करता है), मान (मेरे उदाहरण में) दो तत्वों के साथ एक सरणी है, और एमआर सरणी वापस नहीं कर सकता है।
यदि किसी विशेष कुंजी के लिए एक एकल दस्तावेज़ उत्सर्जित होता है (जो कि _id:1 के मामले में है), तो कम करें फ़ंक्शन को नहीं कहा जाएगा। यह बताता है कि जब आप शून्य वर्ण नहीं छोड़ते हैं तो आपको त्रुटि संदेश क्यों नहीं मिलता है।
इस MR ऑपरेशन को काम करने के लिए, आपको {characters:""} के लिए एक ही दस्तावेज़ निकालने की आवश्यकता है। यदि आप अपने डेटा के बारे में अतिरिक्त जानकारी प्रदान करते हैं, तो हम समाधान खोजने में मदद कर सकते हैं।
संपादित करें:
निम्न कम करें फ़ंक्शन यह सुनिश्चित करेगा कि एक सरणी के बजाय एक मान लौटाया जाए:
reduce = function(key, values) {
return values[0];
}
संपादित करें 2:
त्रुटि को रोकने के लिए, "errmsg":"अपवाद:नक्शा आह्वान विफल:JS त्रुटि:लेखन त्रुटि:this.characters में कोई गुण नहीं है nofile_b:1", "code":9014...
map = function() {
if (this.characters != null){
var array = this.characters.split(',');
emit(this.characters, array.length);
}
}