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

MongoDB-এ এম্বেডেড ডকুমেন্টের অ্যারে-এ রেঞ্জ কোয়েরি (Range Query on Array of Embedded Documents)


MongoDB এগ্রিগেশনে $match, $addFields, $filter ব্যবহার করে এম্বেডেড ডকুমেন্টের অ্যারে-র রেঞ্জ কোয়েরি

MongoDB-এ একটি অ্যারে-র ভেতরে এম্বেডেড ডকুমেন্ট থাকলে (যেমন userDetails: [{UserName, Score}]), সেটির থেকে নির্দিষ্ট রেঞ্জ (Range)য় পড়া এলিমেন্টগুলো বের করতে এগ্রিগেশন পাইপলাইন ব্যবহার করা হয়।

১. কালেকশন ও এম্বেডেড অ্যারে ডেটা তৈরি

> db.demo346.insertOne({
  _id: 101,
  userDetails: [ { UserName: "Chris", Score: 78 }, { UserName: "David", Score: 68 }, { UserName: "Bob", Score: 88 } ]
});
{ "acknowledged" : true, "insertedId" : 101 }
> db.demo346.insertOne({
  _id: 102,
  userDetails: [ { UserName: "Mike", Score: 92 }, { UserName: "Sam", Score: 62 }, { UserName: "Carol", Score: 97 } ]
});
{ "acknowledged" : true, "insertedId" : 102 }

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

> db.demo346.find();

আউটপুট:

{ "_id" : 101, "userDetails" : [ { "UserName" : "Chris", "Score" : 78 }, { "UserName" : "David", "Score" : 68 }, { "UserName" : "Bob", "Score" : 88 } ] }
{ "_id" : 102, "userDetails" : [ { "UserName" : "Mike", "Score" : 92 }, { "UserName" : "Sam", "Score" : 62 }, { "UserName" : "Carol", "Score" : 97 } ] }

৩. এগ্রিগেশন কোয়েরি: Score 80-99 এর মধ্যে থাকা ইউজাররা মাত্র রাখা

> db.demo346.aggregate([
  { "$match": { "$expr": { "$gte": [{ "$size": { "$ifNull": ["$userDetails", []] } }, 1] }}},
  { "$addFields": {
      "userDetails": { "$filter": {
        "input": { "$ifNull": ["$userDetails", []] },
        "cond": { "$and": [
          { "$gte": ["$$this.Score", 80] },
          { "$lte": ["$$this.Score", 99] }
        ]}
      }}
  }}
])

স্টেজ ব্যাখ্যা:

  1. $match + $expr + $size + $ifNull - শুধু যেসব ডকুমেন্টে userDetails অ্যারে আছে এবং কমপক্ষে ১টি এলিমেন্ট আছে, সেগুলোই आगे পাঠায় (Error handling)।
  2. $addFields + $filter - userDetails অ্যারে-র ভেতর থেকে Score 80-99 রেঞ্জের এলিমেন্টগুলো মাত্র রেখে বাকি বাদ দেয়।
  3. $$this - ফিল্টারের মধ্যে বর্তমান এলিমেন্টকে রিপ্রেজেন্ট করে।

৪. ফলাফল

{ "_id" : 101, "userDetails" : [ { "UserName" : "Bob", "Score" : 88 } ] }
{ "_id" : 102, "userDetails" : [ { "UserName" : "Mike", "Score" : 92 }, { "UserName" : "Carol", "Score" : 97 } ] }

প্রথম ডকুমেন্ট থেকে শুধু Bob (88), দ্বিতীয় থেকে Mike (92) এবং Carol (97) বাকি থাকেছে। Chris (78), David (68), Sam (62) বাদ পড়েছে।


  1. MongoDB-তে এমবেডেড ডকুমেন্ট কোয়েরি করা (aggregate + $unwind)

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

  3. MongoDB-এ এমবেডেড ডকুমেন্টের অ্যারে ফিল্টার করা (৩ লেভেল)

  4. MongoDB-এ অবজেক্টের অ্যারে থেকে নেস্টেড ডকুমেন্ট কোয়েরি করা ($elemMatch)