MongoDB एग्रीगेशन: $unwind, $match, $group से ऐरे के मल्टीपल एलिमेंट फ़िल्टर करें
ऐरे के अंदर ऑब्जेक्ट को फ़िल्टर करके केवल मैचिंग एलिमेंट प्राप्त करने के लिए एग्रीगेशन पाइपलाइन का उपयोग करें।
कलेक्शन बनाएं और डॉक्यूमेंट इन्सर्ट करें
> db.retrieveMultipleDemo.insertOne({
"UserDetails": [
{"_id": "101", "UserName": "John", "UserAge": 23},
{"_id": "102", "UserName": "Carol", "UserAge": 21},
{"_id": "103", "UserName": "David", "UserAge": 23},
{"_id": "104", "UserName": "Sam", "UserAge": 25}
]
});
{ "acknowledged": true, "insertedId": ObjectId("5cd40c85edc6604c74817cf0") }
डॉक्यूमेंट देखें
> db.retrieveMultipleDemo.find().pretty();
{
"_id": ObjectId("5cd40c85edc6604c74817cf0"),
"UserDetails": [
{"_id": "101", "UserName": "John", "UserAge": 23},
{"_id": "102", "UserName": "Carol", "UserAge": 21},
{"_id": "103", "UserName": "David", "UserAge": 23},
{"_id": "104", "UserName": "Sam", "UserAge": 25}
]
}
एग्रीगेशन: id 101 या 103 AND उम्र 23 वाले एलिमेंट
> var myIds = ["101", "103"];
> db.retrieveMultipleDemo.aggregate([
{$unwind: "$UserDetails"},
{$match: {"UserDetails._id": {$in: myIds}, "UserDetails.UserAge": 23}},
{$group: {"_id": "$_id", "UserDetails": {$push: "$UserDetails"}}},
{$project: {"_id": 0, "UserDetails": 1}}
]);
{ "UserDetails": [{"_id": "101", "UserName": "John", "UserAge": 23}, {"_id": "103", "UserName": "David", "UserAge": 23}] }
पाइपलाइन चरण समझें
$unwind: "$UserDetails"- ऐरे को फ्लैट करता है, प्रत्येक एलिमेंट अलग डॉक्यूमेंट बनाता है$match- फ़िल्टर: _id इन myIds में हो AND UserAge = 23$group- मूल _id द्वारा फिर से ग्रुप करके ऐरे पुनर्निर्माण ($push)$project- _id छुपाएं, केवल UserDetails दिखाएं
नोट: myIds वेरिएबल
शेल वेरिएबल myIds एग्रीगेशन में सीधे उपयोग हो जाता है। ड्राइवर कोड में सरणी लिटरल पास करें।
बेहतर विकल्प (MongoDB 3.6+): $filter
db.retrieveMultipleDemo.aggregate([
{$project: {
UserDetails: {
$filter: {
input: "$UserDetails",
cond: {$and: [
{$in: ["$$this._id", myIds]},
{$eq: ["$$this.UserAge", 23]}
]}
}
}
}}
])
$filter अधिक कुशल है क्योंकि $unwind की जरूरत नहीं।