Query Nested Object (Dictionary-like) ด้วย Dot Notation
MongoDB รองรับการ Query ลึกเข้าไปใน Nested Object (Embedded Document) โดยใช้ Dot Notation ระบุ Path ไปยังฟิลด์เป้าหมาย
ตัวอย่างข้อมูล: โครงสร้าง Dictionary ของ Customer
> db.findInDictionaryDemo.insertOne({
"_id": 101,
"AllCustomerDetails": {
"SomeCustomerDetail1": { "CustomerName1": "John Doe", "CustomerName2": "John Smith" },
"SomeCustomerDetail2": { "CustomerName1": "Carol Taylor", "CustomerName2": "David Miller" }
}
});
> db.findInDictionaryDemo.insertOne({
"_id": 102,
"AllCustomerDetails": {
"SomeCustomerDetail1": { "CustomerName1": "Sam Wiliams", "CustomerName2": "Bob Johnson" },
"SomeCustomerDetail2": { "CustomerName1": "Chris Brown", "CustomerName2": "Mike Wilson" }
}
});
คิวรี: หาเอกสารที่ CustomerName2 ใน SomeCustomerDetail2 เป็น "Mike Wilson"
> db.findInDictionaryDemo.find({
"AllCustomerDetails.SomeCustomerDetail2.CustomerName2": "Mike Wilson"
}).pretty();
ผลลัพธ์
{ "_id" : 102,
"AllCustomerDetails" : {
"SomeCustomerDetail1" : { "CustomerName1" : "Sam Wiliams", "CustomerName2" : "Bob Johnson" },
"SomeCustomerDetail2" : { "CustomerName1" : "Chris Brown", "CustomerName2" : "Mike Wilson" }
}
}
Dot Notation Patterns
| Pattern | ตัวอย่าง | Match |
|---|---|---|
| Single Level | { "address.city": "Bangkok" } | Object ใน Object |
| Array of Objects | { "orders.items.name": "iPhone" } | Element ใน Array ของ Object |
| Deep Nesting | { "a.b.c.d": "value" } | หลายชั้น |
| Array Index | { "arr.0.name": "First" } | Index เฉพาะใน Array |
ข้อจำกัด
- ไม่สามารถ Query "Key ที่ไม่รู้ชื่อ" ได้โดยตรง (ต้องใช้ $objectToArray ใน Aggregation)
- Dot Notation สร้าง Index ได้ (Single Field Index บน Path)
- ความลึกสูงสุด 100 ระดับ (BSON Limit)
Aggregation สำหรับ Dynamic Keys
// หา Key ใดๆ ใน AllCustomerDetails ที่มี CustomerName2 = "Mike Wilson"
db.findInDictionaryDemo.aggregate([
{ $project: { detailsArray: { $objectToArray: "$AllCustomerDetails" } } },
{ $unwind: "$detailsArray" },
{ $unwind: "$detailsArray.v" },
{ $match: { "detailsArray.v.CustomerName2": "Mike Wilson" } }
]);