आप सही कह रहे हैं कि एक बीएसओएन दस्तावेज़ एक एक्सएमएल दस्तावेज़ नहीं है। चूंकि एक्सएमएल एक पेड़ संरचना में लोड किया गया है जिसमें "नोड्स" शामिल हैं, एक आर्बिटरी कुंजी पर खोज करना काफी आसान है।
एक मोनोडीबी दस्तावेज़ को संसाधित करना इतना आसान नहीं है, और यह कई मामलों में "डेटाबेस" है, इसलिए आम तौर पर "इंडेक्स" और खोज दोनों को आसान बनाने के लिए डेटा स्थानों की एक निश्चित "एकरूपता" होने की उम्मीद है।
बहरहाल, यह किया जा सकता है। लेकिन निश्चित रूप से इसका मतलब सर्वर पर एक पुनरावर्ती प्रक्रिया को क्रियान्वित करना है और इसका अर्थ है $where
के साथ जावास्क्रिप्ट प्रसंस्करण ।
मूल शेल उदाहरण के रूप में, लेकिन सामान्य function
$where
. के लिए सिर्फ एक स्ट्रिंग तर्क है हर जगह ऑपरेटर:
db.collection.find(
function () {
var findKey = "find-this",
findVal = "please find me";
function inspectObj(doc) {
return Object.keys(doc).some(function(key) {
if ( typeof(doc[key]) == "object" ) {
return inspectObj(doc[key]);
} else {
return ( key == findKey && doc[key] == findVal );
}
});
}
return inspectObj(this);
}
)
तो मूल रूप से, ऑब्जेक्ट में मौजूद कुंजियों का परीक्षण करके देखें कि क्या वे वांछित "फ़ील्ड नाम" और सामग्री से मेल खाते हैं। यदि उन कुंजियों में से एक "ऑब्जेक्ट" होती है, तो फ़ंक्शन में पुन:प्रवेश करें और फिर से निरीक्षण करें।
जावास्क्रिप्ट .some()
यह सुनिश्चित करता है कि पाया गया "पहला" मिलान true
. देते हुए खोज फ़ंक्शन से वापस आ जाएगा परिणाम और उस वस्तु को वापस करना जहां वह "कुंजी/मान" कुछ गहराई पर मौजूद था।
ध्यान दें कि $where
अनिवार्य रूप से आपके पूरे संग्रह का पता लगाने का मतलब है जब तक कि संग्रह पर "इंडेक्स" पर लागू होने के अलावा कोई अन्य मान्य क्वेरी फ़िल्टर न हो।
तो सावधानी से उपयोग करें, या बिल्कुल नहीं और डेटा को अधिक व्यावहारिक रूप में फिर से संरचित करने के साथ काम करें।
लेकिन यह आपको आपका मैच देगा।