MongoDB ใช้ Dot Notation (.) เพื่อเข้าถึงและค้นหาฟิลด์ภายใน Embedded Document (Inner Class/Sub-document) ได้โดยตรง
สร้างคอลเลกชันและข้อมูลตัวอย่าง
> db.searchInInnerDemo.insertOne({
"StudentFirstName": "Robert",
"StudentTechnicalDetails": {
"StudentBackEndTechnology": "MongoDB",
"StudentLanguage": "Java"
}
});
{ "acknowledged": true, "insertedId": ObjectId("5cd2dd89b64f4b851c3a13d2") }
> db.searchInInnerDemo.insertOne({
"StudentFirstName": "David",
"StudentTechnicalDetails": {
"StudentBackEndTechnology": "MySQL",
"StudentLanguage": "PHP"
}
});
{ "acknowledged": true, "insertedId": ObjectId("5cd2dda3b64f4b851c3a13d3") }
แสดงข้อมูลทั้งหมด
> db.searchInInnerDemo.find().pretty();
ผลลัพธ์:
{
"_id": ObjectId("5cd2dd89b64f4b851c3a13d2"),
"StudentFirstName": "Robert",
"StudentTechnicalDetails": {
"StudentBackEndTechnology": "MongoDB",
"StudentLanguage": "Java"
}
}
{
"_id": ObjectId("5cd2dda3b64f4b851c3a13d3"),
"StudentFirstName": "David",
"StudentTechnicalDetails": {
"StudentBackEndTechnology": "MySQL",
"StudentLanguage": "PHP"
}
}
กรณีที่ 1: ค้นหาตรง property เดียวใน Inner Document
ใช้ Dot Notation ระบุเส้นทาง: StudentTechnicalDetails.StudentBackEndTechnology
> db.searchInInnerDemo.find({"StudentTechnicalDetails.StudentBackEndTechnology": "MongoDB"}).pretty();
ผลลัพธ์: พบ Robert ที่ใช้ MongoDB
{
"_id": ObjectId("5cd2dd89b64f4b851c3a13d2"),
"StudentFirstName": "Robert",
"StudentTechnicalDetails": {
"StudentBackEndTechnology": "MongoDB",
"StudentLanguage": "Java"
}
}
กรณีที่ 2: ค้นหาตรง Inner Document ทั้งอ็อบเจกต์ (Exact Match)
ระบุค่าทุกฟิลด์ใน Sub-document:
> db.searchInInnerDemo.find({
"StudentTechnicalDetails": {
"StudentBackEndTechnology": "MongoDB",
"StudentLanguage": "Java"
}
}).pretty();
ผลลัพธ์: เหมือนกัน (ต้องตรงทุกฟิลด์และลำดับไม่สำคัญ)
{
"_id": ObjectId("5cd2dd89b64f4b851c3a13d2"),
"StudentFirstName": "Robert",
"StudentTechnicalDetails": {
"StudentBackEndTechnology": "MongoDB",
"StudentLanguage": "Java"
}
}
ความแตกต่างระหว่าง 2 แบบ
| วิธี | คำสั่ง | เงื่อนไขการจับคู่ |
|---|---|---|
| Dot Notation (Field Level) | {"parent.child": "value"} | ตรงฟิลด์นั้นๆ อย่างน้อย 1 ฟิลด์ |
| Exact Sub-document Match | {"parent": {"child1": "v1", "child2": "v2"}} | ต้องตรงทุกฟิลด์ใน Sub-document |
เคล็ดลับ
- Dot Notation ยืดหยุ่นกว่า เหมาะสำหรับค้นหาเงื่อนไขบางส่วน
- Exact Match เหมาะสำหรับค้นหาเอกสารที่มีโครงสร้างย่อยเหมือนกันทั้งหมด
- รองรับ Nested หลายชั้น:
"a.b.c.d"