ใช้ dot notation (จุด) เพื่อ query เข้าไปใน object ที่ซ้อนหลายระดับ (deeply nested) สร้างคอลเลกชันตัวอย่าง (3 ระดับ):
> db.demo350.insertOne({
id:101, Name: "Chris",
details: [{ _id: 1, ClientNumber: "10001", ClientDetails: [
{Name:"David", Age:29}, {Name:"Bob", Age:31}
]}]
});
{ "acknowledged" : true, "insertedId" : ObjectId("5e553a68f8647eb59e5620b8") }
> db.demo350.insertOne({
id:102, Name: "David",
details: [{ _id: 2, ClientNumber: "10002", ClientDetails: [
{Name:"Carol", Age:42}, {Name:"John", Age:37}
]}]
});
{ "acknowledged" : true, "insertedId" : ObjectId("5e553a8ff8647eb59e5620b9") }
แสดงข้อมูล:
> db.demo350.find();
ค้นหาเอกสารที่มี ClientDetails.Name = "John":
> db.demo350.find({"details.ClientDetails.Name":"John"});
ผลลัพธ์:
{ "_id" : ObjectId("5e553a8ff8647eb59e5620b9"), "id" : 102, "Name" : "David", "details" : [ { "_id" : 2, "ClientNumber" : "10002", "ClientDetails" : [ { "Name" : "Carol", "Age" : 42 }, { "Name" : "John", "Age" : 37 } ] } ] }
การทำงานของ Dot Notation แบบ Deep
- MongoDB ข้ามอาร์เรย์โดยอัตโนมัติ:
details.ClientDetails.Nameหมายถึง "ในอาร์เรย์ details, ในแต่ละสมาชิก ให้ดูอาร์เรย์ ClientDetails, ในแต่ละสมาชิก ให้ดู Name" - จับคู่ได้หาก มี path ใด path หนึ่ง ตรงเงื่อนไข
- หากต้องการจับคู่หลายเงื่อนไขบน สมาชิกตัวเดียวกัน ใช้
$elemMatch(อาจต้อง nested $elemMatch) - สร้างดัชนีได้:
db.demo350.createIndex({"details.ClientDetails.Name": 1})