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" } ] }
স্টেপ বাই স্টেপ ব্যাখ্যা:
$unwind: "$Details"- Details অ্যারে ফ্ল্যাটেন করে, প্রতিটি এলিমেন্ট আলাদা ডকুমেন্ট বানায়$lookup- demo102 কালেকশনের সাথে জয়েন:Details.PId=_id, রেজাল্টoutঅ্যারেতে$project-$arrayElemAt: ["$out.CustEmailId", 0]দিয়ে জয়েন রেজাল্টের প্রথম ইমেইল নেয়া (out অ্যারে হওয়ায়)$group- আবার_idঅনুযায়ী গ্রুপ করে Details অ্যারে রিকনস্ট্রাক্ট করা
ফলাফলের অর্থ: PId "200" → "John@gmail.com", PId "201" → "Carol@gmail.com"। ডুপ্লিকেট "201" দুবার "Carol@gmail.com" বানেছে।
পরফরম্যান্স টিপস: foreignField (_id) -এ ইনডেক্স থাকে ডিফল্টে। localField -এ ইনডেক্স দিয়ে লুকআপ দ্রুত করা যায়। বড় ডেটাসেটে pipeline সিনট্যাক্স ব্যবহার করুন।