कुछ समस्याएं हैं जो इसे व्यावहारिक नहीं बनाती हैं:
- चूंकि क्वेरी प्रोजेक्शन करने की क्षमता से एक विशिष्ट पैरामीटर है, यह केवल एक क्वेरी से संभव नहीं है, क्योंकि प्रोजेक्शन क्वेरी के परिणामों से प्रभावित नहीं हो सकता है
- चूंकि एकत्रीकरण ढांचे के साथ फ़ील्ड और चेक प्रकार को पुनरावृत्त करने का कोई तरीका नहीं है, यह भी एक विकल्प नहीं है
कहा जा रहा है, मैप-रिड्यूस का उपयोग करने का थोड़ा अजीब तरीका है जो समान उत्तर प्राप्त करता है, हालांकि मैप-रिड्यूस स्टाइल आउटपुट में यह कमाल नहीं है:
map = function() {
function isNumber(n) {
return !isNaN(parseFloat(n)) && isFinite(n);
}
var numerics = [];
for(var fn in this) {
if (isNumber(this[fn])) {
numerics.push({f: fn, v: this[fn]});
}
if (Array.isArray(this[fn])) {
// example ... more complex logic needed
if(isNumber(this[fn][0])) {
numerics.push({f: fn, v: this[fn]});
}
}
}
emit(this._id, { n: numerics });
};
reduce = function(key, values) {
return values;
};
यह पूर्ण नहीं है, लेकिन परिणाम वही हैं जो आप चाहते थे:
"_id" : ObjectId("52fac254f40ff600c10e56d4"),
"value" : {
"n" : [
{
"f" : "list",
"v" : [
1,
2,
3,
4,
5
]
},
{
"f" : "views",
"v" : 5
}
]
}
नक्शा केवल प्रत्येक संपत्ति को देख रहा है और यह तय कर रहा है कि क्या यह एक संख्या की तरह दिखता है ... और यदि ऐसा है, तो एक सरणी में जोड़ना जो एक वस्तु के रूप में संग्रहीत किया जाएगा ताकि नक्शा-कम इंजन सरणी आउटपुट पर चकित न हो। मैंने इसे उदाहरण कोड में सरल रखा है - आप निश्चित रूप से संख्यात्मक और सरणी जांच के तर्क में सुधार कर सकते हैं। :)पी>
बेशक, यह find
. की तरह लाइव नहीं है या एकत्रीकरण, लेकिन चूंकि MongoDB को इसे ध्यान में रखकर डिज़ाइन नहीं किया गया था, इसलिए यदि आप वास्तव में यह कार्यक्षमता चाहते हैं तो ऐसा करना पड़ सकता है।