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

ค้นหาข้อมูลใน Inner Class (Embedded Document) ด้วย Dot Notation ใน MongoDB

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"