MongoDB-এ _id ফিল্ড ইমিউটেবল (পরিবর্তনযোগ্য নয়) - একবার তৈরি হলে সরাসরি আপডেট করা যায় না। _id পরিবর্তন করতে হলে নতুন _id সহ ডকুমেন্ট ইনসার্ট করে পুরনো ডকুমেন্টটি ডিলিট করতে হয়।
নমুনা কালেকশন তৈরি
> db.updatingDemo.insertOne({ "StudentName": "Robert" });
{ "acknowledged": true, "insertedId": ObjectId("5e04dae5150ee0e76c06a04b") }
> db.updatingDemo.insertOne({ "StudentName": "Bob" });
{ "acknowledged": true, "insertedId": ObjectId("5e04dae7150ee0e76c06a04c") }
ডকুমেন্টগুলো দেখানো
> db.updatingDemo.find();
আউটপুট:
{ "_id": ObjectId("5e04dae5150ee0e76c06a04b"), "StudentName": "Robert" }
{ "_id": ObjectId("5e04dae7150ee0e76c06a04c"), "StudentName": "Bob" }
_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 })
ফলাফল যাচাই
> db.updatingDemo.find();
আউটপুট:
{ "_id": ObjectId("5e04dae5150ee0e76c06a04b"), "StudentName": "Robert" }
{ "_id": 1001, "StudentName": "Bob" }
ব্যাখ্যা:
findOne()দিয়ে ডকুমেন্ট ভেরিয়েবলে সংরক্ষণ।myDocument._id = 1001- নতুন _id সেট করা (যেকোনো ভ্যালু হতে পারে: স্ট্রিং, নাম্বার, ObjectId)।insert()- নতুন _id সহ ডকুমেন্ট ইনসার্ট।remove()- পুরনো _id वाले ডকুমেন্ট ডিলিট।
সতর্কতা
- এই পদ্ধতিতে রেফারেন্স ইন্টিগ্রিটি বজায় রাখা কঠিন (অন্য কালেকশন থেকে রেফারেন্স থাকলে)।
- ট্রানজ্যাকশন (MongoDB ৪.০+) ব্যবহার করাই ভালো।
_idম্যানুয়ালি সেট করার সময় ইউনিকনেস নিশ্চিত করুন।
বিকল্প: replaceOne()
db.updatingDemo.replaceOne(
{ _id: ObjectId("5e04dae7150ee0e76c06a04c") },
{ _id: 1001, "StudentName": "Bob" }
);
একটি অ্যাটোমিক অপারেশনে রিপ্লেস করে, কিন্তু _id পরিবর্তন সাপোর্ট করে না (এরর দেবে)। তাই ইনসার্ট+রিমুভ পদ্ধতিই বাধ্যতামূলক।