অ্যারে অবজেক্টের নেস্টেড ফিল্ড দিয়ে ফিল্টার: ডট নোটেশন
MongoDB-এ অ্যারে অবজেক্টের ভেতরে আবার অবজেক্ট থাকলে (নেস্টেড), ডট নোটেশন চেইন করে find() এ ফিল্টার করা যায়।
নমুনা ডেটা তৈরি
> db.demo465.insertOne({
id: 101,
details: [
{ Name: "Chris", Info: { Subject: "MongoDB", Marks: 67 } },
{ Name: "David", Info: { Subject: "MySQL", Marks: 78 } }
]
})
> db.demo465.insertOne({
id: 102,
details: [
{ Name: "Bob", Info: { Subject: "Java", Marks: 45 } },
{ Name: "Carol", Info: { Subject: "C", Marks: 67 } }
]
})
সমস্ত ডকুমেন্ট দেখানো
> db.demo465.find()
আউটপুট:
{ "_id": ObjectId("..."), "id": 101, "details": [{ "Name": "Chris", "Info": { "Subject": "MongoDB", "Marks": 67 } }, { "Name": "David", "Info": { "Subject": "MySQL", "Marks": 78 } }] }
{ "_id": ObjectId("..."), "id": 102, "details": [{ "Name": "Bob", "Info": { "Subject": "Java", "Marks": 45 } }, { "Name": "Carol", "Info": { "Subject": "C", "Marks": 67 } }] }
"Bob" নামের ডিটেইলস থাকা ডকুমেন্ট খুঁজে বের করা
> db.demo465.find({ "details.Name": "Bob" })
ফলাফল:
{ "_id": ObjectId("..."), "id": 102, "details": [{ "Name": "Bob", "Info": { "Subject": "Java", "Marks": 45 } }, { "Name": "Carol", "Info": { "Subject": "C", "Marks": 67 } }] }
ব্যাখ্যা
details.Name: অ্যারেdetailsএর প্রতিটি এলিমেন্টেরNameফিল্ড চেক করে- যদি অ্যারেতে একাধিক এলিমেন্টে "Bob" থাকে, তবে ডকুমেন্ট একবারই রিটার্ন হবে
- যদি নেস্টেড অবজেক্টের ফিল্ড দিয়ে ফিল্টার করতে হয়:
{ "details.Info.Subject": "Java" } - এটি
$elemMatchছাড়া সিম্পল কোয়েরি, কিন্তু একই এলিমেন্টে একাধিক শর্ত চেক করতে হলে$elemMatchলাগবে
সিম্পল ফিল্টারিংয়ের জন্য ডট নোটেশন সবচেয়ে সহজ এবং দ্রুত।