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

อัปเดตเอกสารซ้อน (Nested Document) ใน MongoDB

ใช้ $set พร้อม dot notation เพื่ออัปเดตฟิลด์ในเอกสารซ้อน (nested document) สร้างคอลเลกชันตัวอย่าง:

> db.demo315.insertOne({ _id :101,
  details: [
    {Name: 'Chris', subjects: [{id:1001, SubjectName:"MySQL"}]}
  ]
});
{ "acknowledged" : true, "insertedId" : 101 }

แสดงข้อมูล:

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

อัปเดตเพิ่ม subject ใหม่เข้าไปในอาร์เรย์ subjects (ตำแหน่ง index 1):

> db.demo315.update({_id:101}, { '$set': {"details.0.subjects.1.id" :1004} })
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

ตรวจสอบผลลัพธ์:

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

ผลลัพธ์ (มี subject ใหม่ id:1004 เพิ่มเข้ามา):

{ "_id" : 101, "details" : [ { "Name" : "Chris", "subjects" : [ { "id" : 1001, "SubjectName" : "MySQL" }, { "id" : 1004 } ] } ] }

คำอธิบาย Dot Notation

  • details.0: อ้างอิงอาร์เรย์ details ตำแหน่งที่ 0 (ตัวแรก)
  • subjects.1: อ้างอิงอาร์เรย์ subjects ตำแหน่งที่ 1 (ตัวที่สอง)
  • .id: ฟิลด์ id ของออบเจ็กต์นั้น
  • MongoDB จะสร้างฟิลด์/อาร์เรย์ใหม่หากไม่มีอยู่ (upsert behavior ใน $set)

ข้อควรระวัง

การอัปเดตด้วย array index (เช่น .0, .1) อาจผิดพลาดหากลำดับอาร์เรย์เปลี่ยนแปลง ควรพิจารณาใช้ $elemMatch หรือ $[<identifier>] (filtered positional operator) ใน MongoDB 3.6+ เพื่ออัปเดตตามเงื่อนไขที่ชัดเจนกว่า