ใช้ Operator $set ร่วมกับ Dot Notation เพื่อเพิ่มหรือแก้ไขฟิลด์ภายใน Embedded Document (Sub-object) โดยไม่กระทบฟิลด์อื่นใน Object เดียวกัน
สร้างคอลเลกชันและข้อมูลตัวอย่าง
> db.updateSubObjectDemo.insertOne({
"ClientId": 100,
"ClientDetails": {"ClientFirstName": "Adam"}
});
{ "acknowledged": true, "insertedId": ObjectId("5cd31434b64f4b851c3a13e9") }
แสดงข้อมูลก่อนอัปเดต
> db.updateSubObjectDemo.find().pretty();
ผลลัพธ์:
{
"_id": ObjectId("5cd31434b64f4b851c3a13e9"),
"ClientId": 100,
"ClientDetails": {"ClientFirstName": "Adam"}
}
คำสั่ง: เพิ่ม ClientLastName = "Smith" เข้าไปใน ClientDetails
> db.updateSubObjectDemo.update(
{ClientId: 100},
{$set: {"ClientDetails.ClientLastName": "Smith"}}
);
WriteResult({ "nMatched": 1, "nUpserted": 0, "nModified": 1 })
ตรวจสอบผลลัพธ์
> db.updateSubObjectDemo.find().pretty();
ClientDetails มีทั้ง FirstName และ LastName แล้ว:
{
"_id": ObjectId("5cd31434b64f4b851c3a13e9"),
"ClientId": 100,
"ClientDetails": {
"ClientFirstName": "Adam",
"ClientLastName": "Smith"
}
}
จุดสำคัญของ $set กับ Dot Notation
- เพิ่มฟิลด์ใหม่ใน Sub-object ได้ (ไม่ต้องมีอยู่ก่อน)
- แก้ไขฟิลด์ที่มีอยู่แล้วได้
- ไม่ลบฟิลด์อื่นใน Sub-object เดียวกัน (Non-destructive)
- หาก Path ไม่มีอยู่ MongoDB จะสร้าง Path ให้อัตโนมัติ (Create intermediate objects)
ตัวอย่างเพิ่มเติม
// เพิ่มฟิลด์ซ้อนหลายชั้น
db.updateSubObjectDemo.update(
{ClientId: 100},
{$set: {"ClientDetails.Address.City": "Bangkok", "ClientDetails.Address.Country": "Thailand"}}
);
// ใช้ $unset เพื่อลบฟิลด์ใน Sub-object
db.updateSubObjectDemo.update(
{ClientId: 100},
{$unset: {"ClientDetails.ClientLastName": ""}}
);
รูปแบบใหม่ (MongoDB 3.2+)
db.updateSubObjectDemo.updateOne(
{ClientId: 100},
{$set: {"ClientDetails.ClientLastName": "Smith"}}
);