เปลี่ยนค่า _id ใน MongoDB: Insert ใหม่ + Remove เก่า
บทความนี้สาธิตว่า _id ใน MongoDB เป็น Immutable (ไม่สามารถ Update โดยตรงได้) วิธีแก้คือ Insert เอกสารใหม่พร้อม _id ใหม่ แล้ว Remove เอกสารเก่า
ขั้นตอนที่ 1: สร้าง Collection และเพิ่มข้อมูลตัวอย่าง
> db.updatingDemo.insertOne({"StudentName":"Robert"});
{ "acknowledged": true, "insertedId": ObjectId("5e04dae5150ee0e76c06a04b") }
> db.updatingDemo.insertOne({"StudentName":"Bob"});
{ "acknowledged": true, "insertedId": ObjectId("5e04dae7150ee0e76c06a04c") }
ขั้นตอนที่ 2: แสดงข้อมูลทั้งหมด
> db.updatingDemo.find();
ผลลัพธ์:
{ "_id": ObjectId("5e04dae5150ee0e76c06a04b"), "StudentName": "Robert" }
{ "_id": ObjectId("5e04dae7150ee0e76c06a04c"), "StudentName": "Bob" }
ขั้นตอนที่ 3: เปลี่ยน _id ของ Bob จาก ObjectId เป็น 1001
findOneหาเอกสาร Bob เก็บไว้ในตัวแปร- แก้ไข
myDocument._id = 1001 insertเอกสารใหม่ (จะได้ _id ใหม่คือ 1001)removeเอกสารเก่าตาม _id เดิม
> myDocument = db.updatingDemo.findOne({"StudentName":"Bob"});
{ "_id": ObjectId("5e04dae7150ee0e76c06a04c"), "StudentName": "Bob" }
> myDocument._id = 1001;
1001
> db.updatingDemo.insert(myDocument);
WriteResult({ "nInserted": 1 })
> db.updatingDemo.remove({_id:ObjectId("5e04dae7150ee0e76c06a04c")});
WriteResult({ "nRemoved": 1 })
ขั้นตอนที่ 4: ตรวจสอบผลลัพธ์
> db.updatingDemo.find();
ผลลัพธ์:
{ "_id": ObjectId("5e04dae5150ee0e76c06a04b"), "StudentName": "Robert" }
{ "_id": 1001, "StudentName": "Bob" }
สรุป: _id ไม่สามารถ Update แบบ In-place ได้ ต้อง Insert ใหม่พร้อม _id ใหม่ แล้วลบเก่า ระวังเรื่อง Foreign Key References หากมี Collection อื่นอ้างอิง _id นี้