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

อัปเดต Sub-object (Embedded Document) ใน MongoDB ด้วย $set

ใช้ 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"}}
);