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

แทนที่เอกสาร MongoDB ทั้งหมด (Replace Entire Document) ด้วย update()

การใช้ update() โดยส่ง Object ใหม่เป็นพารามิเตอร์ที่ 2 (ไม่มี Update Operators เช่น $set) จะทำให้ MongoDB แทนที่เอกสารทั้งอัน (Full Document Replacement) เก็บเฉพาะฟิลด์ใน Object ใหม่

สร้างคอลเลกชันและข้อมูลตัวอย่าง

> db.replacingEntireDocumentDemo.insertOne({
    "StudentFirstName": "John",
    "StudentLastName": "Smith",
    "StudentCountryName": "US"
  });
{ "acknowledged": true, "insertedId": ObjectId("5cd3119bb64f4b851c3a13e8") }

แสดงข้อมูลก่อนแทนที่

> db.replacingEntireDocumentDemo.find().pretty();

ผลลัพธ์:

{
  "_id": ObjectId("5cd3119bb64f4b851c3a13e8"),
  "StudentFirstName": "John",
  "StudentLastName": "Smith",
  "StudentCountryName": "US"
}

คำสั่ง: แทนที่เอกสารทั้งหมดด้วย Object ใหม่

ใช้ Query ตรงกับเอกสารเดิม และส่ง Object ใหม่ทั้งหมด:

> db.replacingEntireDocumentDemo.update(
  {"StudentFirstName": "John", "StudentLastName": "Smith", "StudentCountryName": "US"},
  {"StudentFirstName": "David", "StudentLastName": "Miller", "StudentCountryName": "AUS"}
);
WriteResult({ "nMatched": 1, "nUpserted": 0, "nModified": 1 })

ตรวจสอบผลลัพธ์

> db.replacingEntireDocumentDemo.find().pretty();

เอกสารถูกแทนที่สมบูรณ์ (ฟิลด์เดิมหายไป ฟิลด์ใหม่แทนที่):

{
  "_id": ObjectId("5cd3119bb64f4b851c3a13e8"),
  "StudentFirstName": "David",
  "StudentLastName": "Miller",
  "StudentCountryName": "AUS"
}

⚠️ ข้อควรระวังสำคัญ

  • _id จะคงอยู่ (ยกเว้นจะระบุ _id ใหม่ใน Object แทนที่)
  • ฟิลด์เดิมทั้งหมดจะหายไป หากไม่อยู่ใน Object ใหม่
  • ไม่มี Operator ($set, $inc, etc.) ใน Object แทนที่ → ถือเป็น Replacement
  • ต่างจาก $set ที่ Merge fields

เทียบ Replacement vs $set

ลักษณะReplacement (Plain Object)$set Operator
ฟิลด์เดิมถูกลบทิ้ง (ถ้าไม่อยู่ใน Object ใหม่)คงอยู่ (Merge)
ฟิลด์ใหม่เพิ่มเข้ามาเพิ่มเข้ามา
_idคงเดิม (ปกติ)คงเดิม
Atomicใช่ใช่

แนะนำ: ใช้ replaceOne() แทน (MongoDB 3.2+)

db.replacingEntireDocumentDemo.replaceOne(
  {"StudentFirstName": "John"},
  {"StudentFirstName": "David", "StudentLastName": "Miller", "StudentCountryName": "AUS"}
);

replaceOne() ชัดเจนกว่า และป้องกันการ Replacement ผิดพลาดจากการลืม $set