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

MongoDB-এ অ্যারেতে ম্যাচ করা অবজেক্টের সংখ্যা অনুযায়ী ডকুমেন্ট খোঁজা ($where / Aggregation)

MongoDB-এ একটি ডকুমেন্টের অ্যারে ফিল্ডে নির্দিষ্ট শর্ত পূরণকারী অবজেক্টের সংখ্যা (count) অনুযায়ী ডকুমেন্ট ফিল্টার করার জন্য $where (JavaScript ফাংশন) বা Aggregation Pipeline ($unwind + $group + $match) ব্যবহার করা হয়। $where ধীর এবং সিকিউরিটি রিস্ক বহন করে, তাই Aggregation প্রিয়।

উদাহরণ: কালেকশন ও ডেটা তৈরি

> db.demo694.insertOne({
    details: [
      { Name: "Chris", Age: 21 },
      { Name: "David", Age: 22 }
    ]
});
{ "acknowledged" : true, "insertedId" : ObjectId("5ea59279ece4e5779399c07f") }

> db.demo694.insertOne({
    details: [
      { Name: "Bob", Age: 21 },
      { Name: "Mike", Age: 23 }
    ]
});
{ "acknowledged" : true, "insertedId" : ObjectId("5ea5927aece4e5779399c080") }

> db.demo694.insertOne({
    details: [
      { Name: "Chris", Age: 21 },
      { Name: "Carol", Age: 22 }
    ]
});
{ "acknowledged" : true, "insertedId" : ObjectId("5ea5927aece4e5779399c081") }

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

> db.demo694.find();

আউটপুট:

{ "_id" : ObjectId("5ea59279ece4e5779399c07f"), "details" : [ { "Name" : "Chris", "Age" : 21 }, { "Name" : "David", "Age" : 22 } ] }
{ "_id" : ObjectId("5ea5927aece4e5779399c080"), "details" : [ { "Name" : "Bob", "Age" : 21 }, { "Name" : "Mike", "Age" : 23 } ] }
{ "_id" : ObjectId("5ea5927aece4e5779399c081"), "details" : [ { "Name" : "Chris", "Age" : 21 }, { "Name" : "Carol", "Age" : 22 } ] }

পদ্ধতি ১: $where (JavaScript ফাংশন) — প্রস্তাবিত নয়

> var nameChrisAge21 = function() {
    var inc = 0;
    this.details.forEach(function(d) {
      if (d.Name == "Chris" && d.Age == 21) {
        inc = inc + 1;
      }
    });
    if (inc >= 1) { return true; }
  };

> db.demo694.find({ $where: nameChrisAge21 });

আউটপুট: প্রথম ও তৃতীয় ডকুমেন্ট (Chris, Age 21 আছে)۔

পদ্ধতি ২: Aggregation Pipeline (প্রস্তাবিত — দ্রুত, সিকিউর, ইন্ডেক্স ব্যবহার করে)

> db.demo694.aggregate([
    { $unwind: "$details" },
    { $match: { "details.Name": "Chris", "details.Age": 21 } },
    { $group: { _id: "$_id", count: { $sum: 1 }, details: { $push: "$details" } } },
    { $match: { count: { $gte: 1 } } },
    { $project: { _id: 1, details: 1 } }
])

Aggregation ব্যাখ্যা

  1. $unwind — অ্যারে ফ্ল্যাটেন।
  2. $match — শর্তানুসারী সাবডকুমেন্ট ফিল্টার।
  3. $group — মূল ডকুমেন্ট (_id) অনুযায়ী গ্রুপ করে কাউন্ট (count) এবং সাবডকুমেন্টগুলো (details) সংগ্রহ।
  4. $match: { count: { $gte: 1 } } — কমপক্ষে ১টি ম্যাচ আছে এমন ডকুমেন্ট রাখুন।
  5. $project — আউটপুট ফরম্যাট।

মূল পয়েন্টসমূহ

  • $where এড়ান: JavaScript ইঞ্জিন চালু করে, ধীর, ইন্ডেক্স ব্যবহার করে না, ইনজেকশন রিস্ক।
  • Aggregation ব্যবহার করুন: দ্রুত, ইন্ডেক্স ব্যবহার করে, এক্সপ্রেসিভ।
  • $expr (MongoDB 3.6+) দিয়ে find()-এও এগরিগেশন এক্সপ্রেশন ব্যবহার করা যায়।
  • অ্যারে এলিমেন্ট কাউন্ট করার জন্য $size ব্যবহার করুন যদি পুরো অ্যারের সাইজ লাগে।
  1. MongoDB-এ অ্যারে অনুযায়ী ডকুমেন্ট ফিল্টার করা

  2. MongoDB-তে অবজেক্টের অ্যারে অনুসন্ধান করা

  3. MongoDB-এ ক্যাপড কালেকশন ব্যবহার করে ডকুমেন্ট সংখ্যা লিমিট করা

  4. MongoDB-এ অ্যারের ডকুমেন্ট কাউন্ট করা নির্দিষ্ট ফিল্ডের মান অনুযায়ী