MongoDB एग्रीगेशन पाइपलाइन: $unwind, $group, $project का संयोजन
यह उदाहरण दर्शाता है कि कैसे $unwind, $group, और $project स्टेज्स को मिलाकर जटिल डेटा ट्रांसफॉर्मेशन किया जाता है।
ऑपरेटर्स का अवलोकन
- $unwind: ऐरे फ़ील्ड को डी-कंस्ट्रक्ट करता है, प्रत्येक एलिमेंट के लिए एक दस्तावेज़ आउटपुट करता है
- $group: निर्दिष्ट _id एक्सप्रेशन द्वारा इनपुट दस्तावेज़ों को ग्रुप करता है
- $project: अनुरोधित फ़ील्ड्स के साथ दस्तावेज़ों को अगले स्टेज में पास करता है
सैंपल डेटा बनाना
> db.demo238.insertOne({
"EmailId" : "John@gmail.com",
"details" : [ { "Name" : "Bob", "isActive" : true } ]
});
> db.demo238.insertOne({
"EmailId" : "Chris@gmail.com",
"details" : [ { "Name" : "David" } ]
});
> db.demo238.insertOne({
"EmailId" : "Mike@gmail.com",
"details" : [ { "Name" : "Carol", "isActive" : true } ]
});
दस्तावेज़ देखना
> db.demo238.find().pretty();
आउटपुट:
{ "_id" : ObjectId("5e4418e3f4cebbeaebec5152"), "EmailId" : "John@gmail.com", "details" : [ { "Name" : "Bob", "isActive" : true } ] }
{ "_id" : ObjectId("5e4418e3f4cebbeaebec5153"), "EmailId" : "Chris@gmail.com", "details" : [ { "Name" : "David" } ] }
{ "_id" : ObjectId("5e4418e4f4cebbeaebec5154"), "EmailId" : "Mike@gmail.com", "details" : [ { "Name" : "Carol", "isActive" : true } ] }
एग्रीगेशन पाइपलाइन: एक्टिव यूज़र्स खोजें
> db.demo238.aggregate([
{ "$match": { "details.isActive": true } }, // 1. केवल एक्टिव वाले दस्तावेज़ फ़िल्टर करें
{ "$unwind": "$details" }, // 2. details ऐरे को फ्लैट करें
{ "$match": { "details.isActive": true } }, // 3. फिर से फ़िल्टर करें (unwind के बाद)
{ "$group": {
"_id": "$details.Name",
"active": { "$first": "$_id" }
}}
]);
आउटपुट:
{ "_id" : "Carol", "active" : ObjectId("5e4418e4f4cebbeaebec5154") }
{ "_id" : "Bob", "active" : ObjectId("5e4418e3f4cebbeaebec5152") }
चरण-दर-चरण स्पष्टीकरण
- पहला $match: दस्तावेज़ स्तर पर फ़िल्टर करता है - केवल वे दस्तावेज़ जिनमें कम से कम एक एक्टिव डिटेल हो
- $unwind: प्रत्येक details एलिमेंट के लिए अलग दस्तावेज़ बनाता है
- दूसरा $match: unwind के बाद, केवल एक्टिव डिटेल्स वाले दस्तावेज़ रखता है
- $group: Name द्वारा ग्रुप करता है, मूल दस्तावेज़ का _id लेता है
सुधार: $project जोड़ना
> db.demo238.aggregate([
{ "$match": { "details.isActive": true } },
{ "$unwind": "$details" },
{ "$match": { "details.isActive": true } },
{ "$group": { "_id": "$details.Name", "active": { "$first": "$_id" } } },
{ "$project": { "_id": 0, "Name": "$_id", "DocumentId": "$active" } }
]);
आउटपुट: { "Name" : "Carol", "DocumentId" : ObjectId("...") }