Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MongoDB

ค้นหาในโครงสร้างแบบ Dictionary ด้วย Value ใน MongoDB

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" } }
]);