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

ดึงข้อมูลจาก Nested JSON Array ใน MongoDB ด้วย Dot Notation

MongoDB รองรับการ Query ลงลึกเข้าไปใน Nested JSON Array ได้โดยใช้ Dot Notation ต่อเนื่อง ไม่ว่าจะลึกแค่ไหน

ไวยากรณ์

db.collection.find({"outerField.innerField.nextInnerField...": "value"}).pretty()

สร้างคอลเลกชันและข้อมูลตัวอย่าง (Nested Array ภายใน Object)

> db.nestedJSONArrayDemo.insertOne({
    "ClientDetails": {
      "ClientPersonalDetails": [
        {"CountryName": "US"},
        {"CountryName": "AUS"},
        {"ClientName": "Chris"},
        {"ClientName": "David"}
      ]
    }
  });
{ "acknowledged": true, "insertedId": ObjectId("5cd2cbb2b64f4b851c3a13bc") }

> db.nestedJSONArrayDemo.insertOne({
    "ClientDetails": {
      "ClientPersonalDetails": [
        {"CountryName": "Belgium"},
        {"CountryName": "Canada"},
        {"CountryName": "Egypt"}
      ]
    }
  });
{ "acknowledged": true, "insertedId": ObjectId("5cd2cc14b64f4b851c3a13bd") }

แสดงข้อมูลทั้งหมด

> db.nestedJSONArrayDemo.find().pretty();

ผลลัพธ์:

{
  "_id": ObjectId("5cd2cbb2b64f4b851c3a13bc"),
  "ClientDetails": {
    "ClientPersonalDetails": [
      {"CountryName": "US"},
      {"CountryName": "AUS"},
      {"ClientName": "Chris"},
      {"ClientName": "David"}
    ]
  }
}
{
  "_id": ObjectId("5cd2cc14b64f4b851c3a13bd"),
  "ClientDetails": {
    "ClientPersonalDetails": [
      {"CountryName": "Belgium"},
      {"CountryName": "Canada"},
      {"CountryName": "Egypt"}
    ]
  }
}

ค้นหาเอกสารที่มี CountryName = "Canada" ใน Nested Array

> db.nestedJSONArrayDemo.find({"ClientDetails.ClientPersonalDetails.CountryName": "Canada"}).pretty();

ผลลัพธ์: พบเอกสารที่ 2 ซึ่งมี Canada ใน Array

{
  "_id": ObjectId("5cd2cc14b64f4b851c3a13bd"),
  "ClientDetails": {
    "ClientPersonalDetails": [
      {"CountryName": "Belgium"},
      {"CountryName": "Canada"},
      {"CountryName": "Egypt"}
    ]
  }
}

การทำงานของ Dot Notation บน Array

  • MongoDB จะ Unwind Array ไปในความคิด (Conceptually) และตรวจสอบทุก Element
  • หาก Element ใด Element หนึ่งใน Array ตรงเงื่อนไข → เอกสารนั้นจะถูกคืนค่า
  • รองรับความลึกไม่จำกัด: "a.b.c.d.e.field"
  • ใช้กับ $elemMatch ได้ หากต้องจับคู่หลายเงื่อนไขใน Object เดียวกันภายใน Array

ตัวอย่างเพิ่มเติม

// หาเอกสารที่มี ClientName = "Chris" ใน Array เดียวกัน
db.nestedJSONArrayDemo.find({"ClientDetails.ClientPersonalDetails.ClientName": "Chris"});

// ใช้ $elemMatch สำหรับเงื่อนไขหลายอย่างใน Object เดียวกันของ Array
db.nestedJSONArrayDemo.find({
  "ClientDetails.ClientPersonalDetails": {
    $elemMatch: {CountryName: "US", ClientName: "Chris"}
  }
});