निश्चित रूप से यदि आप केवल
. को हटाना चाहते हैं, तो आपके टेक्स्ट से इकाइयां तो आप बस एक वैश्विक मिलान करें और प्रतिस्थापित करें:
db.tests.find({ "name": /\ /g }).forEach(function(doc) {
doc.name = doc.name.replace(/ /g,"");
db.tests.update({ "_id": doc._id },{ "$set": { "name": doc.name } });
});
तो हर संयोजन को लिखने की कोई आवश्यकता नहीं होनी चाहिए, रेगेक्स बहुत मैच को /g
से बदल देगा विकल्प। संभवतः /m
. का भी उपयोग करें बहु-पंक्ति के लिए आपका "नाम" स्ट्रिंग में न्यूलाइन वर्ण हैं। एक बुनियादी रेगेक्सर उदाहरण
देखें ।
$setका उपयोग करने की भी अनुशंसा की जाती है। कोड>
.save()
. के बजाय केवल उस फ़ील्ड को संशोधित करने के लिए जिसे आप वास्तव में चाहते हैं पूरा दस्तावेज़ वापस। दस्तावेज़ पढ़ने के बाद से किसी अन्य प्रक्रिया द्वारा किए गए परिवर्तनों को ओवरराइट करने के लिए कम ट्रैफ़िक और कम संभावना है।
आदर्श रूप से आप मोंगोडीबी संस्करण 2.6 और अधिक के साथ थोक संचालन एपीआई का उपयोग करेंगे। यह अपडेट को "बैच" करने की अनुमति देता है ताकि क्लाइंट और सर्वर के बीच फिर से कम ट्रैफ़िक हो:
var bulk = db.tests.initializeOrderedBulkOp();
var count = 0;
db.tests.find({ "name": /\ /g }).forEach(function(doc) {
doc.name = doc.name.replace(/ /g,"");
bulk.find({ "_id": doc._id })
.updateOne({ "$set": { "name": doc.name } });
count++;
if ( count % 1000 == 0 ) {
bulk.execute();
bulk = db.tests.initializeOrderedBulkOp();
}
});
if ( count % 1000 != 0 )
bulk.execute();
इसे सुधारने के आपके प्राथमिक तरीके हैं। दुर्भाग्य से MongoDB अपडेट स्टेटमेंट के लिए इस तरह से इसकी अपडेट एक्सप्रेशन के हिस्से के रूप में मौजूदा मान का उपयोग करने का कोई तरीका नहीं है, इसलिए एकमात्र तरीका लूपिंग है, लेकिन जैसा कि दिखाया गया है, आप संचालन को कम करने के लिए बहुत कुछ कर सकते हैं।