MongoDB รองรับการ query เข้าไปใน subdocument (object ซ้อน object) ได้โดยใช้ Dot Notation (เครื่องหมายจุด) ซึ่งทำให้เข้าถึง field ลึกได้ง่าย
สร้างคอลเลกชันและข้อมูลตัวอย่าง
> db.demo81.insertOne({"StudentDetails":[{"StudentName":"Carol","StudentSubject":"Java"},{"StudentName":"David","StudentSubject":"MongoDB"}]});
{ "acknowledged" : true, "insertedId" : ObjectId("5e2bf6ec71bf0181ecc4229d") }
> db.demo81.insertOne({"StudentDetails":[{"StudentName":"Mike","StudentSubject":"Python"},{"StudentName":"David","StudentSubject":"C"}]});
{ "acknowledged" : true, "insertedId" : ObjectId("5e2bf70471bf0181ecc4229e") }
> db.demo81.insertOne({"StudentDetails":[{"StudentName":"Jace","StudentSubject":"C++"},{"StudentName":"John","StudentSubject":"MySQL"}]});
{ "acknowledged" : true, "insertedId" : ObjectId("5e2bf72071bf0181ecc4229f") }
แสดงข้อมูลทั้งหมด
> db.demo81.find();
ผลลัพธ์:
{ "_id" : ObjectId("5e2bf6ec71bf0181ecc4229d"), "StudentDetails" : [
{ "StudentName" : "Carol", "StudentSubject" : "Java" },
{ "StudentName" : "David", "StudentSubject" : "MongoDB" }
]}
{ "_id" : ObjectId("5e2bf70471bf0181ecc4229e"), "StudentDetails" : [
{ "StudentName" : "Mike", "StudentSubject" : "Python" },
{ "StudentName" : "David", "StudentSubject" : "C" }
]}
{ "_id" : ObjectId("5e2bf72071bf0181ecc4229f"), "StudentDetails" : [
{ "StudentName" : "Jace", "StudentSubject" : "C++" },
{ "StudentName" : "John", "StudentSubject" : "MySQL" }
]}
Query ค้นหา Subdocument ด้วย Dot Notation
> db.demo81.find({"StudentDetails.StudentSubject":"MongoDB"});
ผลลัพธ์
{ "_id" : ObjectId("5e2bf6ec71bf0181ecc4229d"), "StudentDetails" : [
{ "StudentName" : "Carol", "StudentSubject" : "Java" },
{ "StudentName" : "David", "StudentSubject" : "MongoDB" }
]}
คำอธิบาย:
StudentDetails.StudentSubject: MongoDB จะค้นหาใน ทุก element ของ array StudentDetails ว่ามี field StudentSubject เท่ากับ "MongoDB" หรือไม่- คืนค่าเอกสารทั้งหมดที่มี element ตรงเงื่อนไข (ไม่ใช่แค่ element ที่ตรง)
เทคนิคเพิ่มเติม
หากต้องการคืนค่าเฉพาะ element ที่ตรงเงื่อนไข ให้ใช้ $elemMatch ใน projection:
db.demo81.find(
{"StudentDetails.StudentSubject": "MongoDB"},
{"StudentDetails": {$elemMatch: {"StudentSubject": "MongoDB"}}}
)
สรุป: Dot notation เป็นวิธีง่ายและมีประสิทธิภาพสำหรับ query nested fields ทั้งใน array และ object