MongoDB-এ একটি ডকুমেন্টের _id ফিল্ড এবং তার নেস্টেড প্রোপার্টি (যেমন Details.id) সমান কিনা চেক করতে $where ক্লজে জাভাস্ক্রিপ্ট ফাংশন ব্যবহার করা হয়, কারণ সাধারণ কোয়েরি সিনট্যাক্সে ফিল্ড-টু-ফিল্ড কম্পারিজন সরাসরি সাপোর্ট করে না।
নমুনা কালেকশন তৈরি
> db.demo69.insertOne({
"_id": ObjectId("507c7f79bcf86cd7994f6c0e"),
"Details": { "id": ObjectId("507c7f79bcf86cd7994f6c0e") }
});
{ "acknowledged": true, "insertedId": ObjectId("507c7f79bcf86cd7994f6c0e") }
> db.demo69.insertOne({
"_id": ObjectId("507c7f79bcf86cd7994f6c0f"),
"Details": { "id": ObjectId("507c7f79bcf86cd7994f6c0a") }
});
{ "acknowledged": true, "insertedId": ObjectId("507c7f79bcf86cd7994f6c0f") }
ডকুমেন্টগুলো দেখানো
> db.demo69.find();
আউটপুট:
{ "_id": ObjectId("507c7f79bcf86cd7994f6c0e"), "Details": { "id": ObjectId("507c7f79bcf86cd7994f6c0e") } }
{ "_id": ObjectId("507c7f79bcf86cd7994f6c0f"), "Details": { "id": ObjectId("507c7f79bcf86cd7994f6c0a") } }
_id এবং Details.id সমান থাকা ডকুমেন্ট খুঁজে বের করা
> db.demo69.find({
$where: function(){
return this._id.toString() == this.Details.id.toString();
}
}).pretty();
ফলাফল
{
"_id": ObjectId("507c7f79bcf86cd7994f6c0e"),
"Details": { "id": ObjectId("507c7f79bcf86cd7994f6c0e") }
}
ব্যাখ্যা:
$where- জাভাস্ক্রিপ্ট ফাংশন এক্সিকিউট করে প্রতিটি ডকুমেন্টের জন্য।this._id- ডকুমেন্টের _id।this.Details.id- নেস্টেড ফিল্ড।.toString()- ObjectId কে স্ট্রিংয়ে কনভার্ট করে কম্পারিজন (ObjectId ডায়রেক্ট == দিয়ে কম্পার করা যায় না)।- প্রথম ডকুমেন্টে _id এবং Details.id একই, তাই ম্যাচ করেছে।
সতর্কতা: $where পারফরম্যান্স
$whereজাভাস্ক্রিপ্ট エンজিন চালায়, খুব ধীর (COLLSCAN)।- ইন্ডেক্স ব্যবহার করে না।
- বড় ডেটাসেটে এড়াতে হয়।
উন্নত পদ্ধতি: অ্যাগ্রিগেশন با $expr (MongoDB ৩.৬+)
db.demo69.aggregate([
{ $match: { $expr: { $eq: [ "$_id", "$Details.id" ] } } }
]);
$expr অ্যাগ্রিগেশন এক্সপ্রেশন কোয়েরি ল্যাঙ্গুয়েজে ফিল্ড-টু-ফিল্ড কম্পারিজন সাপোর্ট করে এবং আরও দ্রুত (অপ্টিমাইজেশন সম্ভব)।