ไม่สามารถ Update _id โดยตรงได้ แต่สามารถทำได้โดย: สร้าง _id ใหม่ Insert เอกสารใหม่ แล้วลบ _id เก่า
ขั้นตอน 4 Steps
- เก็บ ObjectId เก่าไว้ในตัวแปร
var myDoc = db.yourCollection.findOne({_id: yourOldObjectId}); - กำหนด _id ใหม่
myDoc._id = yourNewObjectId; - Insert เอกสารใหม่
db.yourCollection.insert(myDoc); - ลบเอกสารเก่า
db.yourCollection.remove({_id: yourOldObjectId});
ตัวอย่างจริง
// สร้างข้อมูล 3 รายการ
> db.updateIdDemo.insertOne({"StudentName":"Robert"}); // _id: ...683
> db.updateIdDemo.insertOne({"StudentName":"Chris"}); // _id: ...684
>> db.updateIdDemo.insertOne({"StudentName":"Maxwell"}); // _id: ...685
// แสดงก่อนเปลี่ยน
> db.updateIdDemo.find().pretty();
// เปลี่ยน _id ของ Robert
Step1: > myId = db.updateIdDemo.findOne({_id: ObjectId("...683")});
Step2: > myId._id = ObjectId("...689");
Step3: > db.updateIdDemo.insert(myId);
Step4: > db.updateIdDemo.remove({_id: ObjectId("...683")});
// ตรวจสอบหลังเปลี่ยน
> db.updateIdDemo.find().pretty();
ผลลัพธ์: _id ของ Robert เปลี่ยนจาก ...683 เป็น ...689 แล้ว
{ "_id" : ObjectId("...684"), "StudentName" : "Chris" }
{ "_id" : ObjectId("...685"), "StudentName" : "Maxwell" }
{ "_id" : ObjectId("...689"), "StudentName" : "Robert" } // _id ใหม่
หมายเหตุ: _id เป็น Immutable Field ใน MongoDB ไม่สามารถ $set ได้โดยตรง วิธีนี้คือ Workaround มาตรฐาน