MongoDB में एग्रीगेशन और $unwind का उपयोग करके नेस्टेड ऐरे में _id द्वारा खोजना
MongoDB में ऑब्जेक्ट्स के ऐरे के भीतर किसी विशिष्ट _id वाले एलिमेंट को खोजने के लिए $unwind के साथ एग्रीगेशन पाइपलाइन का उपयोग करें। नियमित find() पूरे दस्तावेज़ लौटाता है, न कि केवल मिलान करने वाला ऐरे एलिमेंट।
उदाहरण: संग्रह और दस्तावेज़ बनाना
> db.demo414.insertOne(
{
"_id": "110",
"details":[
{"StudentName":"John","StudentMarks":56},
{"StudentName":"Robert","StudentMarks":98}
]
}
);
{ "acknowledged" : true, "insertedId" : "110" }
दस्तावेज़ देखना
> db.demo414.find();
आउटपुट:
{ "_id" : "110", "details" : [ { "StudentName" : "John", "StudentMarks" : 56 }, { "StudentName" : "Robert", "StudentMarks" : 98 } ] }
StudentMarks 56 वाले ऐरे एलिमेंट को खोजना
> db.demo414.aggregate([
{$unwind: "$details"},
{$match:{"details.StudentMarks": 56}}
])
आउटपुट:
{ "_id" : "110", "details" : { "StudentName" : "John", "StudentMarks" : 56 } }
व्याख्या:
$unwind: "$details"- details ऐरे के प्रत्येक एलिमेंट के लिए अलग दस्तावेज़ बनाता है$match: {"details.StudentMarks": 56}- केवल StudentMarks 56 वाले दस्तावेज़ रखता है- परिणाम में details अब ऐरे नहीं, बल्कि एकल ऑब्जेक्ट है
मूल संरचना बहाल करने के लिए:
db.demo414.aggregate([
{$unwind: "$details"},
{$match: {"details.StudentMarks": 56}},
{$group: {_id: "$_id", details: {$push: "$details"}}}
])
विकल्प (MongoDB 3.6+): $filter के साथ प्रोजेक्शन
db.demo414.find(
{},
{details: {$elemMatch: {StudentMarks: 56}}}
)
// या
db.demo414.aggregate([
{$project: {
details: {$filter: {input: "$details", as: "d", cond: {$eq: ["$$d.StudentMarks", 56]}}}
}}
])
नोट: $elemMatch प्रोजेक्शन में केवल पहला मेल खाने वाला एलिमेंट लौटाता है।