অ্যারে ফিল্ড ফিল্টার: $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 এই সমস্যা সমাধান করে।