इसके बारे में सब कुछ काफी भयानक है, आप संभवतः "नाम" मानों जैसी किसी चीज़ पर अनुक्रमित नहीं कर सकते हैं और प्रत्येक विशेषता के लिए आपका "पथ" हर जगह अलग-अलग होगा। तो यह वास्तव में प्रश्नों के लिए बुरा है।
मैंने देखा है कि आप "नेस्टेड" संरचनाओं का उल्लेख करते हैं, और आप अभी भी इसे एक समान प्रस्ताव और कुछ अतिरिक्त टैगिंग के साथ समायोजित कर सकते हैं, लेकिन मैं चाहता हूं कि आप इस "फोन बुक" प्रकार के उदाहरण पर विचार करें:
{
"phones": [
{
"type": "Home",
"name" : "Jeff",
"phone" : "123-123-1234"
},
{
"type": "Work",
"name" : "Jeff",
"phone" : "123-123-1234"
},
]
}
चूंकि यह वास्तव में एक सरणी के भीतर उप-दस्तावेज़ है, "नाम" जैसे फ़ील्ड हमेशा एक ही पथ साझा करते हैं, इसलिए न केवल आप इन्हें अनुक्रमित कर सकते हैं (जो प्रदर्शन के लिए अच्छा होगा) लेकिन क्वेरी बहुत बुनियादी है:
db.collection({ "phones.name": "Jeff" })
यह वही करता है जो आपको किसी भी "नाम" प्रविष्टि में "जेफ" ढूंढकर चाहिए। यदि आपको पदानुक्रम की आवश्यकता है, तो उन उप-दस्तावेजों में कुछ फ़ील्ड जोड़ें जो माता-पिता/बाल संबंधों को इंगित करने के लिए पोस्ट प्रोसेसिंग में उपयोग कर सकते हैं। या यहां तक कि एक भौतिक मार्ग के रूप में जो आपके प्रश्नों की सहायता कर सकता है।
यह वास्तव में बेहतर तरीका है।
यदि आपको वास्तव में इस तरह की संरचना रखनी है तो कम से कम जावास्क्रिप्ट के साथ ऐसा कुछ करें जो पहले मैच में गहराई से बाहर निकल जाए:
db.collection.find(
function () {
var found = false;
var finder = function( obj, field, value ) {
if ( obj.hasOwnProperty(field) && obj[field] == value )
found = true;
if (found) return true;
for( var n in obj ) {
if ( Object.prototype.toString.call(obj[n]) === "[object Object]" ) {
finder( obj[n], field, value );
if (found) return true;
}
}
};
finder( this, "name", "Jeff" );
return found;
}
)
वहाँ प्रारूप $where
ऑपरेटर, जो प्रदर्शन के लिए बहुत बुरी खबर है, लेकिन आपकी संरचना बहुत अधिक विकल्प नहीं दे रही है। किसी भी दर पर, फ़ंक्शन को प्रत्येक नेस्टेड दस्तावेज़ में "मान" के साथ "फ़ील्ड" मिलने तक रिकर्स करना चाहिए।
उत्पादन पैमाने की किसी भी चीज़ के लिए, वास्तव में संरचना को किसी ऐसी चीज़ में बदलने पर विचार करें जिसे अनुक्रमित किया जा सकता है और जल्दी से पहुँचा जा सकता है। पहला उदाहरण आपको एक प्रारंभिक बिंदु देना चाहिए। प्रश्नों के लिए मनमानी जावास्क्रिप्ट पर भरोसा करना क्योंकि आपकी वर्तमान संरचना आपको बाधित करती है, बुरी खबर है।