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

MongoDB-এ সাবডকুমেন্ট অ্যারের _id এর সাথে অন্য কালেকশন ম্যাচ করা ($in + distinct)

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

কোয়েরির ব্যাখ্যা

  1. db.demo568.distinct('details.id', { '_id': 101 }) — demo568 কালেকশনে _id: 101 वाले ডকুমেন্টের details.id ফিল্ডের ইউনিক মানগুলো রিটার্ন করে: [101, 103]।
  2. { '_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+) দিয়ে জটিল জয়েন করা যায়।
  1. MongoDB-তে এমবেডেড ডকুমেন্ট কোয়েরি করা (aggregate + $unwind)

  2. MongoDB-তে $elemMatch ব্যবহার করে অ্যারে ভ্যালু অনুযায়ী ডকুমেন্ট ফিল্টার করা

  3. MongoDB-তে এমবেডেড ডকুমেন্ট অ্যারে কোয়েরি করে নতুন এলিমেন্ট যোগ করা ($push + $nin)

  4. MongoDB-তে $elemMatch এবং $and দিয়ে অ্যারে ফিল্ডে একাধিক শর্ত মিলিয়ে ডকুমেন্ট বের করা