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

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


অ্যারে ফিল্ড ফিল্টার: $elemMatch

MongoDB-এ একটি ডকুমেন্টের অ্যারে ফিল্ডের মধ্যে যেকোনো একটি এলিমেন্ট নির্দিষ্ট শর্ত পূরণ করলে সেই ডকুমেন্ট রিটার্ন করতে $elemMatch ব্যবহার করা হয়।

নমুনা ডেটা তৈরি

> db.demo453.insertOne({ _id: 101, details: [{ Name: "David", Marks: 60 }, { Name: "Mike", Marks: 55 }] })
> db.demo453.insertOne({ _id: 102, details: [{ Name: "Bob", Marks: 80 }, { Name: "Sam", Marks: 78 }] })
> db.demo453.insertOne({ _id: 103, details: [{ Name: "Carol", Marks: 67 }, { Name: "John", Marks: 79 }] })

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

> db.demo453.find()

আউটপুট:

{ "_id": 101, "details": [{ "Name": "David", "Marks": 60 }, { "Name": "Mike", "Marks": 55 }] }
{ "_id": 102, "details": [{ "Name": "Bob", "Marks": 80 }, { "Name": "Sam", "Marks": 78 }] }
{ "_id": 103, "details": [{ "Name": "Carol", "Marks": 67 }, { "Name": "John", "Marks": 79 }] }

Marks >= 75 থাকা ডকুমেন্ট ফিল্টার

> db.demo453.find({
    details: { $elemMatch: { Marks: { $gte: 75 } } }
})

ফলাফল:

{ "_id": 102, "details": [{ "Name": "Bob", "Marks": 80 }, { "Name": "Sam", "Marks": 78 }] }
{ "_id": 103, "details": [{ "Name": "Carol", "Marks": 67 }, { "Name": "John", "Marks": 79 }] }

ব্যাখ্যা

  • $elemMatch: অ্যারেতে একই এলিমেন্টে সব শর্ত পূরণ হয় কিনা চেক করে
  • ডকুমেন্ট ১০২: Bob (80) এবং Sam (78) - উভয়ই >=75, তাই ডকুমেন্ট মিলে
  • ডকুমেন্ট ১০৩: John (79) >=75, Carol (67) নয় - কিন্তু একটিই মেললে ডকুমেন্ট মিলে
  • ডকুমেন্ট ১০১: কেউ >=75 নয়, তাই বাদ

$elemMatch vs ডট নোটেশন: ডট নোটেশন (details.Marks) ব্যবহার করলে আলাদা এলিমেন্ট থেকেও মátus হতে পারে (যেমন একটি এলিমেন্টে Marks:80, অন্যটিতে Marks:60 থাকলে {$gte:75, $lte:70} ভুলভাবে মэтচ করতে পারে)। $elemMatch এই সমস্যা সমাধান করে।

  1. MongoDB-এ অ্যারেতে এলিমেন্ট যুক্ত করার পদ্ধতি

  2. MongoDB-এ অগরিগেশন এবং $unwind ব্যবহার করে সাব-ডকুমেন্ট ফিল্টার করা

  3. MongoDB-এ অ্যারে থেকে এলিমেন্ট মুছে ফেলা ($pull অপারেটর)

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