อัปเดตเอกสารเฉพาะที่ตรงตามเงื่อนไขด้วย update() และ upsert
คำสั่ง update() ใน MongoDB สามารถทำงานแบบมีเงื่อนไขได้ โดยระบุ filter condition และใช้ upsert: true เพื่อสร้างเอกสารใหม่หากไม่พบเอกสารที่ตรงเงื่อนไข
ตัวอย่างข้อมูลทดสอบ
> db.demo402.insertOne({ id: 101, "Name": "Chris" });
> db.demo402.insertOne({ id: 102, "Name": "David" });
> db.demo402.insertOne({ id: 103, "Name": "Mike" });
แสดงข้อมูลก่อนอัปเดต
> db.demo402.find();
ผลลัพธ์:
{ "_id": ObjectId("..."), "id": 101, "Name": "Chris" }
{ "_id": ObjectId("..."), "id": 102, "Name": "David" }
{ "_id": ObjectId("..."), "id": 103, "Name": "Mike" }
คำสั่งอัปเดต Name ของ id=102 เป็น Robert (พร้อม upsert)
> db.demo402.update(
{ id: 102 },
{ $set: { Name: "Robert" } },
{ upsert: true }
);
ผลลัพธ์: WriteResult({ "nMatched": 1, "nUpserted": 0, "nModified": 1 })
แสดงข้อมูลหลังอัปเดต
> db.demo402.find();
ผลลัพธ์:
{ "_id": ObjectId("..."), "id": 101, "Name": "Chris" }
{ "_id": ObjectId("..."), "id": 102, "Name": "Robert" }
{ "_id": ObjectId("..."), "id": 103, "Name": "Mike" }
คำอธิบายพารามิเตอร์
- Filter: { id: 102 }: เงื่อนไขค้นหาเอกสารที่ต้องการอัปเดต
- Update: { $set: { Name: "Robert" } }: ใช้ $set เพื่อเปลี่ยนแปลงเฉพาะฟิลด์ Name
- Options: { upsert: true }: หากไม่พบเอกสาร id=102 จะสร้างเอกสารใหม่
รูปแบบใหม่ที่แนะนำ (MongoDB 3.2+)
> db.demo402.updateOne(
{ id: 102 },
{ $set: { Name: "Robert" } },
{ upsert: true }
);
ใช้ updateOne() สำหรับอัปเดต 1 เอกสาร หรือ updateMany() สำหรับหลายเอกสาร