কম্পিউটার টিউটোরিয়াল

MongoDB অ্যাগ্রিগেশন: $unwind, $group এবং $project বাস্তবায়ন

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") }

ব্যাখ্যা:

  1. ১ম $match: শুধু details.isActive: true থাকা ডকুমেন্ট ফিল্টার (John এবং Mike)।
  2. $unwind: details অ্যারে ফ্ল্যাটেন (John-এ ১, Mike-এ ১ = ২ ডকুমেন্ট)।
  3. ২য় $match: আনউইন্ডের পর আবার isActive: true ফিল্টার (David বাদ পড়ে)।
  4. $group: details.Name দিয়ে গ্রুপ করে, $first: "$_id" দিয়ে মূল ডকুমেন্টের _id নেয়।

নোট: উদাহরণে David-এর isActive ফিল্ড নেই, তাই সেটি ফিল্টার আউট হয়েছে। ফলাফলে Bob এবং Carol দেখাচ্ছে তাদের মূল ডকুমেন্টের _id সহ।

সাধারণ প্যাটার্ন

db.collection.aggregate([
  { $match: { ... } },           // প্রাথমিক ফিল্টার (ইন্ডেক্স ব্যবহার)
  { $unwind: "$arrayField" },    // অ্যারে ফ্ল্যাটেন
  { $match: { ... } },           // এলিমেন্ট লেভেল ফিল্টার
  { $group: { _id: ..., ... } }, // গ্রুপিং এবং অগেটিগেশন
  { $project: { ... } },         // আউটপুট শেপ
  { $sort: { ... } },            // সর্ট
  { $limit: 10 }                 // লিমিট
]);
  1. MongoDB Aggregation-এ $match এবং $project বাস্তবায়ন

  2. MongoDB-এ ঘন্টার অনুসারে সমষ্টি (Aggregate) এবং $avg ব্যবহার

  3. MongoDB অ্যাগ্রিগেশন: নেস্টেড অ্যারে এলিমেন্টের গড় (Average) বের করা ($avg + $unwind)

  4. MongoDB এগ্রিগেশন: একাধিক ফিল্ড গ্রুপ বাই করে ফলাফল বের করা ($facet)