MongoDB-এ এক কালেকশনের সাবডকুমেন্ট অ্যারে থেকে নির্দিষ্ট ফিল্ডের মান বের করে (distinct), অন্য কালেকশনের _id ফিল্ডের সাথে $in অপারেটর দিয়ে ম্যাচ করা হয়। এটি Joaquín (join)-এর মতো কাজ করে কিন্তু MongoDB-এ জয়েন নেই, তাই ক্লায়েন্ট-সাইড বা এগরিগেশন ($lookup) ব্যবহার করতে হয়।
উদাহরণ: প্রথম কালেকশন (demo568) — সাবডকুমেন্ট অ্যারে
> db.demo568.insertOne({ _id: 101, details: [ { id: 101 }, { id: 103 } ] });
{ "acknowledged" : true, "insertedId" : 101 }
দ্বিতীয় কালেকশন (demo569) — সিম্পল ডকুমেন্ট
> db.demo569.insertOne({ _id: 101, details: "John" });
{ "acknowledged" : true, "insertedId" : 101 }
> db.demo569.insertOne({ _id: 102, details: "Chris" });
{ "acknowledged" : true, "insertedId" : 102 }
> db.demo569.insertOne({ _id: 103, details: "David" });
{ "acknowledged" : true, "insertedId" : 103 }
demo569 থেকে demo568.details.id ম্যাচ করা ডকুমেন্ট বের করা
> db.demo569.find({
'_id': { '$in': db.demo568.distinct('details.id', { '_id': 101 }) }
})
কোয়েরির ব্যাখ্যা
db.demo568.distinct('details.id', { '_id': 101 })—demo568কালেকশনে_id: 101वाले ডকুমেন্টেরdetails.idফিল্ডের ইউনিক মানগুলো রিটার্ন করে:[101, 103]।{ '_id': { '$in': [101, 103] } }—demo569-এ_id১০১ বা ১০৩ olan ডকুমেন্টগুলো বের করে।
আউটপুট
{ "_id" : 101, "details" : "John" }
{ "_id" : 103, "details" : "David" }
উন্নত পদ্ধতি: Aggregation $lookup (MongoDB 3.2+)
সার্ভার-সাইড জয়েনের জন্য $lookup ব্যবহার করুন (দুটি কুয়েরি চালানোর দরকার নেই):
> db.demo568.aggregate([
{ $match: { _id: 101 } },
{ $unwind: "$details" },
{ $lookup: {
from: "demo569",
localField: "details.id",
foreignField: "_id",
as: "matchedDoc"
}},
{ $unwind: "$matchedDoc" },
{ $project: { _id: "$matchedDoc._id", details: "$matchedDoc.details" } }
])
মূল পয়েন্টসমূহ
distinct()ইউনিক মান রিটার্ন করে (অ্যারে)।$inঅ্যারেতে যেকোনো মান ম্যাচ করলে সত্য রিটার্ন করে।- দুটি আলাদা কুয়েরি (client-side join) — বড় ডেটাসেটে ধীর ও মেমরি-খাওয়া।
$lookupসার্ভার-সাইড জয়েন করে, পারফরম্যান্স ভালো এবং একক রিকোয়েস্ট।$lookupএরpipelineআর্গুমেন্ট (MongoDB 3.6+) দিয়ে জটিল জয়েন করা যায়।