इस मामले में आपके पास नेस्टेड दस्तावेज़ है। आपके दस्तावेज़ में एक फ़ील्ड है Notification
जो एक सरणी है जो url
. क्षेत्र के साथ कई उप-वस्तुओं को संग्रहीत करती है . उप-फ़ील्ड में खोजने के लिए, आपको डॉट-सिंटैक्स का उपयोग करना होगा:
BasicDBObject query=new BasicDBObject("Notification.url","www.adf.com");
हालांकि, यह संपूर्ण दस्तावेज़ को संपूर्ण Notification
. के साथ वापस कर देगा सरणी। आप शायद केवल उप-दस्तावेज़ चाहते हैं। इसे फ़िल्टर करने के लिए, आपको Collection.find के दो-तर्क संस्करण
का उपयोग करना होगा .
BasicDBObject query=new BasicDBObject("Notification.url","www.example.com");
BasicDBObject fields=new BasicDBObject("Notification.$", 1);
DBCursor f = con.coll.find(query, fields);
The .$
का अर्थ है "इस सरणी की केवल पहली प्रविष्टि जो खोज-संचालक से मेल खाती है"
यह अभी भी एक उप-सरणी के साथ एक दस्तावेज़ लौटाएगा Notifications
, लेकिन इस सरणी में केवल वही प्रविष्टि होनी चाहिए जहां url == "www.example.com"
।
जावा के साथ इस दस्तावेज़ को पार करने के लिए, यह करें:
BasicDBList notifications = (BasicDBList) f.next().get("Notification");
BasicDBObject notification = (BasicDBObject) notifications.get(0);
String url = notification.get("url");
वैसे: जब आपका डेटाबेस बढ़ता है तो आपको प्रदर्शन समस्याओं का सामना करना पड़ सकता है, जब तक कि आप इस क्वेरी को तेज करने के लिए एक इंडेक्स नहीं बनाते:
con.coll.ensureIndex(new BasicDBObject("Notification.url", 1));