MongoDB में सरणी के अंदर विशिष्ट सबडॉक्यूमेंट को प्रोजेक्ट करने के लिए, क्वेरी फिल्टर के साथ $ (स्थिति प्रोजेक्शन ऑपरेटर) का उपयोग करें।
उदाहरण: विवरण सरणी वाला दस्तावेज़
> db.demo37.insertOne({"Details":[{"Name":"Chris","Age":21},{"Name":"David","Age":23}]});
{ "acknowledged" : true, "insertedId" : ObjectId("5e176635cfb11e5c34d898d7") }
> db.demo37.insertOne({"Details":[{"Name":"Sam","Age":23},{"Name":"Robert","Age":25}]});
{ "acknowledged" : true, "insertedId" : ObjectId("5e17664acfb11e5c34d898d8") }
दस्तावेज़ देखना
> db.demo37.find();
आउटपुट: प्रत्येक में दो सबडॉक्यूमेंट्स वाली सरणी के साथ दो दस्तावेज़।
क्वेरी: Name="Sam" वाले सबडॉक्यूमेंट को प्रोजेक्ट करें
> db.demo37.find(
{ 'Details.Name' : 'Sam' },
{ _id: 0, 'Details.$.Name': 1 }
);
आउटपुट:
{ "Details" : [ { "Name" : "Sam", "Age" : 23 } ] }
व्याख्या
- फिल्टर
{'Details.Name':'Sam'}दस्तावेज़ से मेल खाता है और सरणी में पहला मिलान वाला तत्व पहचानता है। - प्रोजेक्शन
{_id:0, 'Details.$.Name':1}_idको बाहर करता है और$के माध्यम से केवल मिलान वाले सरणी तत्व केNameको शामिल करता है। - नोट: प्रोजेक्शन में
$केवल पहले मिलान वाले तत्व को लौटाता है।
सीमाएं
- केवल एक सरणी फील्ड प्रति क्वेरी
$प्रोजेक्शन का उपयोग कर सकती है। - एकाधिक/सभी मिलान वाले तत्वों के लिए,
$elemMatchप्रोजेक्शन या एग्रीगेशन ($unwind+$match) का उपयोग करें।
वैकल्पिक: $elemMatch प्रोजेक्शन (एकाधिक फील्ड लौटाता है)
> db.demo37.find(
{ "Details.Name": "Sam" },
{ _id: 0, Details: { $elemMatch: { "Name": "Sam" } } }
);
मिलान वाले सबडॉक्यूमेंट के सभी फील्ड्स लौटाता है (सिर्फ Name नहीं)।