ใช้ $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+ เพื่ออัปเดตตามเงื่อนไขที่ชัดเจนกว่า