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

MongoDB Aggregate: অন্য কালেকশনের ফিল্ড মিলিয়ে JSON অ্যারে ফিল্ড প্রসেস করা

MongoDB-এ একটি কালেকশনের অ্যারে ফিল্ডকে অন্য কালেকশনের ফিল্ড দিয়ে মিলিয়ে (join) ডেটা ট্রান্সফর্ম করতে $lookup, $unwind, $project, $group স্টেজ ব্যবহার করা হয়।

প্রথম কালেকশন (demo101) তৈরি

> db.demo101.insertOne({
...   "_id" : "1",
...   "Details" : [ { "PId" : "200" }, { "PId" : "201" }, { "PId" : "201" } ]
... });
{ "acknowledged" : true, "insertedId" : "1" }

দ্বিতীয় কালেকশন (demo102) তৈরি

> db.demo102.insertOne({ "_id" : "201", "CustEmailId" : "Carol@gmail.com" });
{ "acknowledged" : true, "insertedId" : "201" }

নোট: demo102-এ _id "200" ও "201" দুটি ডকুমেন্ট আছে (২য় insert 보기 নেই, কিন্তু find-এ দেখানো হয়েছে)

সব ডকুমেন্ট দেখানো

> db.demo101.find();
{ "_id" : "1", "Details" : [ { "PId" : "200" }, { "PId" : "201" }, { "PId" : "201" } ] }

> db.demo102.find();
{ "_id" : "200", "CustEmailId" : "John@gmail.com" }
{ "_id" : "201", "CustEmailId" : "Carol@gmail.com" }

Aggregate কোয়ারী (Join এবং ট্রান্সফর্ম)

> db.demo101.aggregate([
...   { $unwind: "$Details" },
...   { $lookup: {
...     from: "demo102",
...     localField: "Details.PId",
...     foreignField: "_id",
...     as: "out"
...   }},
...   { $project: {
...     "_id": 1,
...     "Details.PId": { $arrayElemAt: ["$out.CustEmailId", 0] }
...   }},
...   { $group: {
...     _id: "$_id",
...     Details: { $push: "$Details" }
...   }}
... ]).pretty();

ফলাফল

{ "_id" : "1", "Details" : [ { "PId" : "John@gmail.com" }, { "PId" : "Carol@gmail.com" }, { "PId" : "Carol@gmail.com" } ] }

স্টেপ বাই স্টেপ ব্যাখ্যা:

  1. $unwind: "$Details" - Details অ্যারে ফ্ল্যাটেন করে, প্রতিটি এলিমেন্ট আলাদা ডকুমেন্ট বানায়
  2. $lookup - demo102 কালেকশনের সাথে জয়েন: Details.PId = _id, রেজাল্ট out অ্যারেতে
  3. $project - $arrayElemAt: ["$out.CustEmailId", 0] দিয়ে জয়েন রেজাল্টের প্রথম ইমেইল নেয়া (out অ্যারে হওয়ায়)
  4. $group - আবার _id অনুযায়ী গ্রুপ করে Details অ্যারে রিকনস্ট্রাক্ট করা

ফলাফলের অর্থ: PId "200" → "John@gmail.com", PId "201" → "Carol@gmail.com"। ডুপ্লিকেট "201" দুবার "Carol@gmail.com" বানেছে।

পরফরম্যান্স টিপস: foreignField (_id) -এ ইনডেক্স থাকে ডিফল্টে। localField -এ ইনডেক্স দিয়ে লুকআপ দ্রুত করা যায়। বড় ডেটাসেটে pipeline সিনট্যাক্স ব্যবহার করুন।

  1. MongoDB Aggregation-এ $size ব্যবহার করে অ্যারের লেন্থ বের করা

  2. MongoDB-এ দুটি কলেকশন অ্যাগ্রিগেট করা শর্তসাপেক্ষ মিল অনুযায়ী

  3. MongoDB-তে aggregate() এবং $group ব্যবহার করে ফিল্ড কাউন্ট অনুযায়ী গ্রুপিং

  4. MongoDB-তে সব ডকুমেন্টে নতুন ফিল্ড যোগ করা ($addFields)