MongoDB में skip() और map() का उपयोग करके आंशिक डेटा डिलीट करना
डॉक्यूमेंट्स के एक सबसेट को डिलीट करने के लिए (उदाहरण के लिए, पहले N के बाद सभी), आप मिलान करने वाले _id मानों को इकट्ठा करने के लिए skip(), toArray(), और map() का उपयोग कर सकते हैं, फिर $in के साथ remove() का उपयोग कर सकते हैं।
नमूना डेटा बनाना (10 डॉक्यूमेंट्स)
> db.deleteDemo.insertOne({"Name":"John"}); // 1
> db.deleteDemo.insertOne({"Name":"Carol"}); // 2
> db.deleteDemo.insertOne({"Name":"Sam"}); // 3
> db.deleteDemo.insertOne({"Name":"David"}); // 4
> db.deleteDemo.insertOne({"Name":"Robert"}); // 5
> db.deleteDemo.insertOne({"Name":"Chris"}); // 6
> db.deleteDemo.insertOne({"Name":"Mike"}); // 7
> db.deleteDemo.insertOne({"Name":"Bob"}); // 8
> db.deleteDemo.insertOne({"Name":"James"}); // 9
> db.deleteDemo.insertOne({"Name":"Jace"}); // 10
सभी डॉक्यूमेंट्स देखना
> db.deleteDemo.find();
आउटपुट: सभी 10 डॉक्यूमेंट्स _id के साथ क्रम में सूचीबद्ध।
5वें रिकॉर्ड के बाद के डॉक्यूमेंट्स डिलीट करना
> var value = db.deleteDemo.find({}, { _id: 1 }).skip(5).toArray().map(function(documentValue) {
return documentValue._id;
});
> db.deleteDemo.remove({ _id: { $in: value } });
WriteResult({ "nRemoved" : 5 })
चरण-दर-चरण व्याख्या
find({}, { _id: 1 })- केवल _id फील्ड प्रोजेक्ट करता है (कुशल)।skip(5)- पहले 5 डॉक्यूमेंट्स को छोड़ देता है।toArray()- शेष कर्सर को ऐरे में परिवर्तित करता है।map(...)- प्रत्येक डॉक्यूमेंट से केवल _id मान निकालता है।remove({ _id: { $in: value } })- एकत्रित _id वाले सभी डॉक्यूमेंट्स डिलीट करता है।
शेष डॉक्यूमेंट्स वेरिफाई करना
> db.deleteDemo.find();
आउटपुट:
{ "_id" : ObjectId("5cd550492cba06f46efe9f06"), "Name" : "John" }
{ "_id" : ObjectId("5cd5504d2cba06f46efe9f07"), "Name" : "Carol" }
{ "_id" : ObjectId("5cd550512cba06f46efe9f08"), "Name" : "Sam" }
{ "_id" : ObjectId("5cd5505d2cba06f46efe9f09"), "Name" : "David" }
{ "_id" : ObjectId("5cd550682cba06f46efe9f0a"), "Name" : "Robert" }
आधुनिक सर्वोत्तम अभ्यास
remove()के बजायdeleteMany()का उपयोग करें (MongoDB 3.2+ में पेश किया गया)।- बड़े कलेक्शन के लिए,
skip()धीमा हो सकता है; रेंज क्वेरी के लिए इंडेक्स्ड फील्ड (जैसे बनाई गई तिथि) का उपयोग करने पर विचार करें। - उत्पादन में, बड़े डिलीट ऑपरेशन्स के लिए ट्रांजैक्शन या बल्क राइट्स का उपयोग करें।
चेतावनी: यह ऑपरेशन अपरिवर्तनीय है। बड़े डिलीट चलाने से पहले हमेशा क्वेरी के साथ वेरिफाई करें।