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