การ Query เข้าถึง Object ภายใน Array ใน MongoDB สามารถใช้ Dot Notation ได้โดยตรง เนื้อหานี้สาธิตการค้นหาเอกสารที่มี details.SubjectName มีค่า "Servlet" อยู่ใน Array
ตัวอย่างข้อมูลทดสอบ
> db.demo299.insertOne({
"id":100, "Name":"Robert",
"details":[
{ "SubjectName":["C++","Python"] },
{ "SubjectName":["Spring","Hibernate"] }
]
});
{ "acknowledged" : true, "insertedId" : ObjectId("5e4d685a5d93261e4bc9ea4b") }
> db.demo299.insertOne({
"id":101, "Name":"Adam",
"details":[
{ "SubjectName":["Python","JSP"] },
{ "SubjectName":["Servlet","Operating System"] }
]
});
{ "acknowledged" : true, "insertedId" : ObjectId("5e4d685b5d93261e4bc9ea4c") }
แสดงข้อมูลทั้งหมด
> db.demo299.find();
{
"_id" : ObjectId("5e4d685a5d93261e4bc9ea4b"),
"id" : 100,
"Name" : "Robert",
"details" : [
{ "SubjectName" : [ "C++", "Python" ] },
{ "SubjectName" : [ "Spring", "Hibernate" ] }
]
}
{
"_id" : ObjectId("5e4d685b5d93261e4bc9ea4c"),
"id" : 101,
"Name" : "Adam",
"details" : [
{ "SubjectName" : [ "Python", "JSP" ] },
{ "SubjectName" : [ "Servlet", "Operating System" ] }
]
}
Query ค้นหา Object ใน Array
> db.demo299.find({"details.SubjectName":"Servlet"});
ผลลัพธ์
{
"_id" : ObjectId("5e4d685b5d93261e4bc9ea4c"),
"id" : 101,
"Name" : "Adam",
"details" : [
{ "SubjectName" : [ "Python", "JSP" ] },
{ "SubjectName" : [ "Servlet", "Operating System" ] }
]
}
คำอธิบายและข้อจำกัด
- Dot Notation
details.SubjectNameจะ Match ถ้า Element ใด Element หนึ่งใน Array details มี SubjectName ที่ Contain "Servlet" - คืนเอกสารทั้งหมด (Whole Document) ไม่ใช่แค่ Element ที่ Match
- หากต้องการคืนเฉพาะ Element ที่ Match ใช้
$elemMatchใน Projection หรือ Aggregation$filter - ตัวอย่าง $elemMatch Projection:
db.demo299.find( {"details.SubjectName":"Servlet"}, {details: { $elemMatch: { SubjectName: "Servlet" } }} )