อัปเดตค่าในอาร์เรย์โดยใช้ $elemMatch และ positional operator $
บทความนี้สาธิตวิธีการอัปเดตค่าของฟิลด์หนึ่งในออบเจกต์ภายในอาร์เรย์ โดยจับคู่ออบเจกต์เป้าหมายด้วยเงื่อนไขหลายฟิลด์ผ่าน $elemMatch และใช้ Positional Operator $ เพื่ออัปเดตเฉพาะองค์ประกองที่ตรงเงื่อนไข
ขั้นตอนที่ 1: สร้าง Collection และเพิ่มข้อมูลตัวอย่าง
สร้าง collection ชื่อ demo196 มีฟิลด์ details เป็นอาร์เรย์ของออบเจกต์ที่มี FirstName, LastName, Score
> db.demo196.insertOne({
"Id": "101",
"details": [
{ "FirstName": "Chris", "LastName": "Brown", "Score": 45 },
{ "FirstName": "David", "LastName": "Miller", "Score": 87 },
{ "FirstName": "John", "LastName": "Doe", "Score": 56 }
]
});
{ "acknowledged": true, "insertedId": ObjectId("5e3af6b103d395bdc21346d7") }
ขั้นตอนที่ 2: แสดงข้อมูลทั้งหมด
> db.demo196.find();
ผลลัพธ์:
{ "_id": ObjectId("5e3af6b103d395bdc21346d7"), "Id": "101", "details": [
{ "FirstName": "Chris", "LastName": "Brown", "Score": 45 },
{ "FirstName": "David", "LastName": "Miller", "Score": 87 },
{ "FirstName": "John", "LastName": "Doe", "Score": 56 }
] }
ขั้นตอนที่ 3: อัปเดต Score ของ David Miller เป็น 98
ใช้ $elemMatch ในส่วน Query เพื่อหาออบเจกต์ในอาร์เรย์ที่มี FirstName: "David" และ LastName: "Miller" พร้อมกัน แล้วใช้ $set ร่วมกับ details.$.Score (Positional Operator) เพื่ออัปเดตเฉพาะองค์ประกอบที่ตรง
> db.demo196.update(
{"details": {"$elemMatch": {"FirstName": "David", "LastName": "Miller"}}},
{"$set": {"details.$.Score": 98}}
);
WriteResult({ "nMatched": 1, "nUpserted": 0, "nModified": 1 })
ขั้นตอนที่ 4: ตรวจสอบผลลัพธ์
> db.demo196.find();
ผลลัพธ์:
{ "_id": ObjectId("5e3af6b103d395bdc21346d7"), "Id": "101", "details": [
{ "FirstName": "Chris", "LastName": "Brown", "Score": 45 },
{ "FirstName": "David", "LastName": "Miller", "Score": 98 },
{ "FirstName": "John", "LastName": "Doe", "Score": 56 }
] }
สรุป: การรวม $elemMatch ใน Query และ Positional Operator $ ใน Update เป็นวิธีมาตรฐานในการอัปเดตองค์ประกอบเฉพาะในอาร์เรย์ที่จับคู่ด้วยเงื่อนไขหลายฟิลด์