MongoDB में _id फील्ड (प्राइमरी की) अपरिवर्तनीय है; आप मौजूदा दस्तावेज़ के _id को सीधे अपडेट नहीं कर सकते। इसे "बदलने" के लिए, आपको दस्तावेज़ को हटाना होगा और एक नए _id (या कस्टम _id) के साथ पुनः डालना होगा।
उदाहरण: एकल दस्तावेज़
> db.demo41.insertOne({"StudentName":"Carol"});
{ "acknowledged" : true, "insertedId" : ObjectId("5e25ce4acfb11e5c34d898e3") }
दस्तावेज़ देखना
> db.demo41.find();
आउटपुट: { "_id" : ObjectId("5e25ce4acfb11e5c34d898e3"), "StudentName" : "Carol" }
प्राइमरी की "बदलें" (हटाएं और पुनः डालें)
> var next = db.demo41.find()
> next.forEach(function(s) {
var prevId = s._id;
delete s._id;
db.demo41.insert(s);
db.demo41.remove(prevId);
});
नई प्राइमरी की जांचें
> db.demo41.find();
आउटपुट: { "_id" : ObjectId("5e25cee5cfb11e5c34d898e4"), "StudentName" : "Carol" } (नया ObjectId)।
व्याख्या
- सभी दस्तावेज़ों पर पुनरावृत्त करें (
forEach)। - पुराना
_idस्टोर करें। - दस्तावेज़ से
_idहटाएं (delete s._id)। - पुनः डालें → MongoDB नया
_idजनरेट करता है (या आप कस्टम प्रदान कर सकते हैं)। - पुराना दस्तावेज़ उसके
_idद्वारा हटाएं।
महत्वपूर्ण विचार
- एटॉमिक नहीं: यह दो ऑपरेशन है; विफलता असंगत स्थिति छोड़ सकती है। लेनदेन (MongoDB 4.0+) का उपयोग करें।
- कस्टम _id: आप
insert({_id: "my-custom-id", ...})के साथ अपना_idनिर्दिष्ट कर सकते हैं। - संदर्भ: अन्य संग्रह इस
_idको संदर्भित कर सकते हैं; उन्हें भी अपडेट करें। - बल्क: कई दस्तावेज़ों के लिए,
bulkWriteका उपयोग करें।
चेतावनी
उत्पादन में _id बदलने से बचें जब तक बिल्कुल आवश्यक न हो; एप्लिकेशन लॉजिक में सर्जरी किज का उपयोग करें।