ใช้ Dot Notation พร้อม Double Quotes ครอบ Field Path เพื่อ Query ฟิลด์ย่อย (Sub-field) ภายใน Embedded Document ได้โดยตรง
สร้างคอลเลกชันและข้อมูลตัวอย่าง
> db.searchSubFieldDemo.insertOne({
"UserDetails": {"UserEmailId": "John123@gmail.com", "UserAge": 21}
});
{ "acknowledged": true, "insertedId": ObjectId("5cd3d909edc6604c74817ce2") }
> db.searchSubFieldDemo.insertOne({
"UserDetails": {"UserEmailId": "Carol@yahoo.com", "UserAge": 26}
});
{ "acknowledged": true, "insertedId": ObjectId("5cd3d9a4edc6604c74817ce3") }
แสดงข้อมูลทั้งหมด
> db.searchSubFieldDemo.find().pretty();
ผลลัพธ์: 2 เอกสาร มี UserDetails เป็น Object
Query: ค้นหา UserEmailId = "Carol@yahoo.com"
> db.searchSubFieldDemo.find({"UserDetails.UserEmailId": "Carol@yahoo.com"});
ผลลัพธ์: พบเอกสารของ Carol
{
"_id": ObjectId("5cd3d9a4edc6604c74817ce3"),
"UserDetails": {"UserEmailId": "Carol@yahoo.com", "UserAge": 26}
}
รายละเอียด Dot Notation
- Syntax:
"parentField.childField"(ต้องอยู่ใน Quotes) - ทำงานกับ Embedded Document (Object) ทุกระดับ
- MongoDB จะ Traverse เข้าไปหา Field ตาม Path
- หาก Parent เป็น Array → ตรวจสอบทุก Element (Implicit $elemMatch สำหรับ Single Field)
ตัวอย่างความลึกต่างๆ
// Level 1
{"address.city": "Bangkok"}
// Level 2
{"user.profile.address.city": "Bangkok"}
// Level 3 (Array of Objects)
{"orders.items.product.name": "iPhone"}
// Level 4
{"company.departments.employees.skills.name": "MongoDB"}
คำสั่งที่เกี่ยวข้อง
- Projection: ดึงเฉพาะ Sub-field
db.coll.find({}, {"UserDetails.UserEmailId": 1, _id: 0}); - $exists: ตรวจสอบว่ามี Sub-field หรือไม่
db.coll.find({"UserDetails.UserEmailId": {$exists: true}}); - $type: ตรวจสอบ Type ของ Sub-field
db.coll.find({"UserDetails.UserAge": {$type: "int"}});
Index บน Sub-field
// Single Field Index
db.searchSubFieldDemo.createIndex({"UserDetails.UserEmailId": 1});
// Compound Index
db.searchSubFieldDemo.createIndex({"UserDetails.UserEmailId": 1, "UserDetails.UserAge": -1});
Index บน Sub-field ทำงานได้เหมือน Field ปกติ ช่วย Query เร็วขึ้น