การใช้ 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