MongoDB-এ একটি অ্যারে ফিল্ডের এলিমেন্টগুলোর মধ্যে নির্দিষ্ট ফিল্ড অনুপস্থিত থাকা ডকুমেন্ট খুঁজে বের করতে $elemMatch অপারেটর ব্যবহার করা হয়। এটি অ্যারেতে কমপক্ষে একটি এলিমেন্ট শর্ত পূরণ করলে ডকুমেন্ট ম্যাচ করে।
নমুনা কালেকশন তৈরি
> db.demo239.insertOne({
"Name": "Chris",
"details": [
{ "DueDate": new ISODate("2019-01-21"), "ProductPrice": 1270 },
{ "DueDate": new ISODate("2020-02-12"), "ProductPrice": 2000 }
]
});
{ "acknowledged": true, "insertedId": ObjectId("5e441c6bf4cebbeaebec5157") }
> db.demo239.insertOne({
"Name": "David",
"details": [
{ "DueDate": new ISODate("2018-11-11"), "ProductPrice": 1450 },
{ "DueDate": new ISODate("2020-02-12") }
]
});
{ "acknowledged": true, "insertedId": ObjectId("5e441c6cf4cebbeaebec5158") }
ডকুমেন্টগুলো দেখানো
> db.demo239.find();
আউটপুট:
{
"_id": ObjectId("5e441c6bf4cebbeaebec5157"),
"Name": "Chris",
"details": [
{ "DueDate": ISODate("2019-01-21T00:00:00Z"), "ProductPrice": 1270 },
{ "DueDate": ISODate("2020-02-12T00:00:00Z"), "ProductPrice": 2000 }
]
}
{
"_id": ObjectId("5e441c6cf4cebbeaebec5158"),
"Name": "David",
"details": [
{ "DueDate": ISODate("2018-11-11T00:00:00Z"), "ProductPrice": 1450 },
{ "DueDate": ISODate("2020-02-12T00:00:00Z") }
]
}
ProductPrice ফিল্ড অনুপস্থিত এলিমেন্ট থাকা ডকুমেন্ট খুঁজে বের করা
> db.demo239.find({
"details": {
"$elemMatch": {
"DueDate": { "$exists": true },
"ProductPrice": { "$exists": false }
}
}
})
ফলাফল
{
"_id": ObjectId("5e441c6cf4cebbeaebec5158"),
"Name": "David",
"details": [
{ "DueDate": ISODate("2018-11-11T00:00:00Z"), "ProductPrice": 1450 },
{ "DueDate": ISODate("2020-02-12T00:00:00Z") }
]
}
ব্যাখ্যা:
$elemMatch- অ্যারেতে কমপক্ষে একটি এলিমেন্ট দুটি শর্ত পূরণ করলে ম্যাচ: (১) DueDate আছে, (২) ProductPrice নেই।- Chris-এর উভয় এলিমেন্টে ProductPrice আছে, তাই ম্যাচ করেনি।
- David-এর দ্বিতীয় এলিমেন্টে ProductPrice নেই, DueDate আছে - তাই ম্যাচ করেছে।
$elemMatch ছাড়া (ভুল পদ্ধতি)
// এটি ভুল ফলাফল দেবে - আলাদা এলিমেন্ট থেকে শর্ত পূরণ করলেও ম্যাচ করবে
db.demo239.find({
"details.DueDate": { $exists: true },
"details.ProductPrice": { $exists: false }
})
এটি Chris-এর ডকুমেন্টও রিটার্ন করবে (কারণ প্রথম এলিমেন্টে DueDate আছে, দ্বিতীয়ে ProductPrice নেই - কিন্তু আলাদা এলিমেন্ট)। $elemMatch একই এলিমেন্টে দুটি শর্ত পূরণ চায়।