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

MongoDB: Query Deeply Nested Objects ด้วย Dot Notation

ใช้ 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})