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

ค้นหา Sub-field ใน MongoDB ด้วย Dot Notation และ Double Quotes

ใช้ 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 เร็วขึ้น