MongoDB অ্যাগ্রিগেশন পাইপলাইনের তিনটি গুরুত্বপূর্ণ স্টেজ $unwind, $group, এবং $project একসাথে ব্যবহার করে জটিল ডেটা ট্রান্সফরমেশন করা যায়।
স্টেজ সংক্ষিপ্ত विवরণ
- $unwind: অ্যারে ফিল্ডকে ডিকম্পোজ করে, প্রতিটি এলিমেন্টের জন্য আলাদা ডকুমেন্ট আউটপুট করে।
- $group: নির্দিষ্ট এক্সপ্রেশন (
_id) দিয়ে ডকুমেন্টগুলো গ্রুপ করে, প্রতিটি গ্রুপের জন্য একটি ডকুমেন্ট আউটপুট করে। - $project: ডকুমেন্টের ফিল্ড সিলেক্ট/রিশেপ করে পরবর্তী স্টেজে পাস করে।
নমুনা কালেকশন তৈরি
> db.demo238.insertOne({
"EmailId": "John@gmail.com",
"details": [ { "Name": "Bob", "isActive": true } ]
});
{ "acknowledged": true, "insertedId": ObjectId("5e4418e3f4cebbeaebec5152") }
> db.demo238.insertOne({
"EmailId": "Chris@gmail.com",
"details": [ { "Name": "David" } ]
});
{ "acknowledged": true, "insertedId": ObjectId("5e4418e3f4cebbeaebec5153") }
> db.demo238.insertOne({
"EmailId": "Mike@gmail.com",
"details": [ { "Name": "Carol", "isActive": true } ]
});
{ "acknowledged": true, "insertedId": ObjectId("5e4418e4f4cebbeaebec5154") }
ডকুমেন্টগুলো দেখানো
> 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 } ] }
অ্যাগ্রিগেশন: unwind, group, project বাস্তবায়ন
> db.demo238.aggregate([
{ $match: { "details.isActive": true } },
{ $unwind: "$details" },
{ $match: { "details.isActive": true } },
{ $group: {
_id: "$details.Name",
active: { $first: "$_id" }
}
}
], function(err, result) { /* ... */ });
ফলাফল
{ "_id": "Carol", "active": ObjectId("5e4418e4f4cebbeaebec5154") }
{ "_id": "Bob", "active": ObjectId("5e4418e3f4cebbeaebec5152") }
ব্যাখ্যা:
- ১ম $match: শুধু
details.isActive: trueথাকা ডকুমেন্ট ফিল্টার (John এবং Mike)। - $unwind:
detailsঅ্যারে ফ্ল্যাটেন (John-এ ১, Mike-এ ১ = ২ ডকুমেন্ট)। - ২য় $match: আনউইন্ডের পর আবার
isActive: trueফিল্টার (David বাদ পড়ে)। - $group:
details.Nameদিয়ে গ্রুপ করে,$first: "$_id"দিয়ে মূল ডকুমেন্টের _id নেয়।
নোট: উদাহরণে David-এর isActive ফিল্ড নেই, তাই সেটি ফিল্টার আউট হয়েছে। ফলাফলে Bob এবং Carol দেখাচ্ছে তাদের মূল ডকুমেন্টের _id সহ।
সাধারণ প্যাটার্ন
db.collection.aggregate([
{ $match: { ... } }, // প্রাথমিক ফিল্টার (ইন্ডেক্স ব্যবহার)
{ $unwind: "$arrayField" }, // অ্যারে ফ্ল্যাটেন
{ $match: { ... } }, // এলিমেন্ট লেভেল ফিল্টার
{ $group: { _id: ..., ... } }, // গ্রুপিং এবং অগেটিগেশন
{ $project: { ... } }, // আউটপুট শেপ
{ $sort: { ... } }, // সর্ট
{ $limit: 10 } // লিমিট
]);