ใช้ Positional Operator $ ร่วม Index ของ Array เพื่ออัปเดต Element ตำแหน่งที่แน่นอน
ไวยากรณ์
{$set: {"yourArrayDocumentName.$.yourNestedArrayDocument.yourIndex": "yourValue"}}
สร้างข้อมูลตัวอย่าง (Nested Array)
> db.updateExactField.insertOne({
"ActorId": 1,
"ActorDetails": [
{"ActorName": "Johnny Depp", "MovieList": ["The Tourist", "Public Enemy"]},
{"ActorName": "Chris Evans", "MovieList": ["Captain America", "Avengers"]}
]
});
{ "acknowledged" : true, "insertedId" : ObjectId("5c6d7f63f2db199c1278e7f1") }
แสดงเอกสาร
> db.updateExactField.find().pretty();
Case 1: Update Index 2 (ตำแหน่งที่ 3) ของ MovieList ของ Chris Evans
> db.updateExactField.update(
{"ActorDetails.ActorName": "Chris Evans"},
{$set: {"ActorDetails.$.MovieList.2": "Avengers:Infinity War"}}
);
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
ผลลัพธ์: เพิ่ม "Avengers:Infinity War" เข้าไปที่ Index 2
"MovieList" : ["Captain America", "Avengers", "Avengers:Infinity War"]
Case 2: Update Index 1 (ตำแหน่งที่ 2) ให้เป็น "Gifted"
> db.updateExactField.update(
{"ActorDetails.ActorName": "Chris Evans"},
{$set: {"ActorDetails.$.MovieList.1": "Gifted"}}
);
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
ผลลัพธ์: แทนที่ Index 1 เดิม (Avengers) ด้วย "Gifted"
"MovieList" : ["Captain America", "Gifted", "Avengers:Infinity War"]
สรุป: ใช้ ArrayName.Index ใน $set เพื่อ Target ตำแหน่งที่แน่นอนใน Array (0-based Index)