ป้องกันข้อมูลซ้ำใน MongoDB ด้วย Unique Index และ Upsert
บทความนี้สาธิตวิธีการ Insert ข้อมูลโดยป้องกันไม่ให้มีค่าซ้ำในฟิลด์เฉพาะ โดยการสร้าง Unique Index แล้วใช้ insert() พร้อม upsert: true
ขั้นตอนที่ 1: สร้าง Unique Index บน StudentFirstName
> db.insertWithoutDuplicateDemo.createIndex({"StudentFirstName": 1}, { unique: true });
{ "createdCollectionAutomatically": true, "numIndexesBefore": 1, "numIndexesAfter": 2, "ok": 1 }
ขั้นตอนที่ 2: Insert พร้อม upsert: true
upsert: true หมายถึง: ถ้ามีอยู่แล้ว (Match) -> Update (แต่ที่นี่ไม่มี $set จึงไม่เปลี่ยนอะไร), ถ้าไม่มี -> Insert ใหม่
พร้อม Unique Index จะเกิด Error (E11000) ถ้าพยายาม Insert ค่าซ้ำ
> db.insertWithoutDuplicateDemo.insert({"StudentFirstName":"Chris"},{ upsert: true });
WriteResult({ "nInserted": 1 })
> db.insertWithoutDuplicateDemo.insert({"StudentFirstName":"David"},{ upsert: true });
WriteResult({ "nInserted": 1 })
> db.insertWithoutDuplicateDemo.insert({"StudentFirstName":"Chris"},{ upsert: true });
WriteResult({ "nInserted": 0, "writeError": { "code": 11000, "errmsg": "E11000 duplicate key error..." } })
> db.insertWithoutDuplicateDemo.insert({"StudentFirstName":"Bob"},{ upsert: true });
WriteResult({ "nInserted": 1 })
ขั้นตอนที่ 3: ตรวจสอบข้อมูลสุดท้าย
> db.insertWithoutDuplicateDemo.find().pretty();
ผลลัพธ์: มีแค่ Chris, David, Bob (Chris ครั้งที่ 2 ถูกบล็อค)
{ "_id": ObjectId("5e064405150ee0e76c06a054"), "StudentFirstName": "Chris" }
{ "_id": ObjectId("5e064410150ee0e76c06a055"), "StudentFirstName": "David" }
{ "_id": ObjectId("5e06441f150ee0e76c06a057"), "StudentFirstName": "Bob" }
สรุป: การสร้าง Unique Index ({unique: true}) เป็นวิธีมาตรฐานและมีประสิทธิภาพที่สุดในการป้องกันข้อมูลซ้ำที่ระดับ Database ร่วมกับ upsert สำหรับ Logic "Insert if not exists"