গভীর নেস্টেড অবজেক্টে সার্চ: $where (জাভাস্ক্রিপ্ট)
MongoDB-এ যখন নেস্টেড স্ট্রাকচারের পথ Фиিক্সড না থাকে বা ডাইনামিকভাবে সব প্রোপার্টি চেক করতে হয়, তখন $where দিয়ে জাভাস্ক্রিপ্ট ফাংশন লিখে সার্চ করা যায়।
নমুনা ডেটা তৈরি
> db.demo468.insertOne({
_id: new ObjectId(),
"FirstPosition": { "StudentName": "Chris", "StudentAge": 23 },
"SecondPosition": { "StudentName": "David", "StudentAge": 20 }
})
> db.demo468.insertOne({
_id: new ObjectId(),
"FirstPosition": { "StudentName": "Carol", "StudentAge": 21 },
"SecondPosition": { "StudentName": "John", "StudentAge": 22 }
})
সমস্ত ডকুমেন্ট দেখানো
> db.demo468.find()
আউটপুট:
{ "_id": ObjectId("..."), "FirstPosition": { "StudentName": "Chris", "StudentAge": 23 }, "SecondPosition": { "StudentName": "David", "StudentAge": 20 } }
{ "_id": ObjectId("..."), "FirstPosition": { "StudentName": "Carol", "StudentAge": 21 }, "SecondPosition": { "StudentName": "John", "StudentAge": 22 } }
যেকোনো লেভেলে "John" খুঁজে বের করার কোয়েরি
> db.demo468.find({
$where: function() {
for (var i in this) {
if (this[i]["StudentName"] == "John") {
return true;
}
}
return false;
}
})
ফলাফল:
{ "_id": ObjectId("..."), "FirstPosition": { "StudentName": "Carol", "StudentAge": 21 }, "SecondPosition": { "StudentName": "John", "StudentAge": 22 } }
ব্যাখ্যা
$where: জাভাস্ক্রিপ্ট ফাংশন এক্সিকিউট করে প্রতিটি ডকুমেন্টের জন্যfor (var i in this): ডকুমেন্টের সব টপ-লেভেল কী (FirstPosition,SecondPosition) এর মাধ্যমে লুপ করেthis[i]["StudentName"]: প্রতিটি সাব-অবজেক্টের StudentName চেক করে
⚠️ সতর্কতা
$whereখুব ধীর (ইনডেক্স ব্যবহার করে না, ফুল কোলেকশন স্ক্যান)- সিকিউরিটি রিস্ক: জাভাস্ক্রিপ্ট ইনজেকশন সম্ভব
- বিকল্প: স্কিমা রিডিজাইন করে ফ্ল্যাট ফিল্ড রাখুন বা
$orদিয়ে সব পথ স্পেসিফাই করুন:{ $or: [ { "FirstPosition.StudentName": "John" }, { "SecondPosition.StudentName": "John" } ] }
শুধু জরুরি হলে এবং ছোট ডেটাসেটে ব্যবহার করুন।