आपको अभी भी सामग्री पर पुनरावृति करने की आवश्यकता है, लेकिन इसके बजाय आपको बल्क ऑपरेशंस का उपयोग करके वापस लिखना चाहिए:
MongoDB 2.6 और उच्चतर के लिए:
var bulk = db.collection.initializeUnorderedBulkOp(),
count = 0;
db.collection.find({
"$where": "return !Array.isArray(this.experience)"
}).forEach(function(doc) {
bulk.find({ "_id": doc._id }).updateOne({
"$set": { "experience": [doc.experience["0"]] }
});
count++;
// Write once in 1000 entries
if ( count % 1000 == 0 ) {
bulk.execute();
bulk = db.collection.initializeUnorderedBulkOp();
}
})
// Write the remaining
if ( count % 1000 != 0 )
bulk.execute();
या MongoDB 3.2 और उससे अधिक की आधुनिक रिलीज़ में, bulkWrite()
विधि पसंद की जाती है:
var ops = [];
db.collection.find({
"$where": "return !Array.isArray(this.experience)"
}).forEach(function(doc) {
ops.push({
"updateOne": {
"filter": { "_id": doc._id },
"update": { "$set": { "experience": [doc.experience["0"]] } }
}
});
if ( ops.length == 1000 ) {
db.collection.bulkWrite(ops,{ "ordered": false })
ops = [];
}
})
if ( ops.length > 0 )
db.collection.bulkWrite(ops,{ "ordered": false });
तो जब एक कर्सर पर डेटाबेस पर वापस लिखते हैं, तो "अनॉर्डर्ड" सेट के साथ बल्क राइट ऑपरेशंस जाने का रास्ता है। यह 1000 अनुरोधों के प्रति बैच में केवल एक लेखन/प्रतिक्रिया है, जो बहुत अधिक ओवरहेड को कम करता है, और "अनियंत्रित" का अर्थ है कि सीरियल क्रम के बजाय समानांतर में लिखा जा सकता है। यह सब इसे तेज़ बनाता है।