वर्तमान में MongoDB में अपडेट के लिए अपडेट को लागू करते समय मौजूदा फ़ील्ड के मौजूदा मान को संदर्भित करना संभव नहीं है। तो आपको लूप करना होगा:
db.collection.find({},{ "category": 1 }).forEach(function(doc) {
doc.category = doc.category.trim();
db.collection.update(
{ "_id": doc._id },
{ "$set": { "category": doc.category } }
);
})
$set
. के उपयोग पर ध्यान देना नेटवर्क ट्रैफ़िक को कम करने के लिए वहां ऑपरेटर और अनुमानित "श्रेणी" फ़ील्ड"
आप $regex
. के साथ जो प्रोसेस करते हैं उसे सीमित कर सकते हैं मिलान करने के लिए:
db.collection.find({
"$and": [
{ "category": /^\s+/ },
{ "category": /\s+$/ }
]
})
या यहां तक कि शुद्ध $regex
. के रूप में भी $and
. के उपयोग के बिना जिसे आपको केवल मोंगोडीबी में चाहिए जहां एक ही क्षेत्र में कई शर्तें लागू होंगी। अन्यथा $and
सभी तर्कों में निहित है:
db.collection.find({ "category": /^\s+|\s+$/ })
जो मिलान किए गए दस्तावेज़ों को केवल उन लोगों के लिए संसाधित करने के लिए प्रतिबंधित करता है जिनके पास आगे या पीछे सफेद स्थान है।
यदि आप देखने के लिए दस्तावेज़ों की संख्या के बारे में चिंतित हैं, तो यदि आपके पास MongoDB 2.6 या इससे अधिक उपलब्ध है, तो बल्क अपडेट से मदद मिलनी चाहिए:
var batch = [];
db.collection.find({ "category": /^\s+|\s+$/ },{ "category": 1 }).forEach(
function(doc) {
batch.push({
"q": { "_id": doc._id },
"u": { "$set": { "category": doc.catetgory.trim() } }
});
if ( batch.length % 1000 == 0 ) {
db.runCommand("update", batch);
batch = [];
}
}
);
if ( batch.length > 0 )
db.runCommand("update", batch);
या यहां तक कि MongoDB 2.6 और इसके बाद के संस्करण के लिए थोक संचालन API के साथ:
var counter = 0;
var bulk = db.collection.initializeOrderedBulkOp();
db.collection.find({ "category": /^\s+|\s+$/ },{ "category": 1}).forEach(
function(doc) {
bulk.find({ "_id": doc._id }).update({
"$set": { "category": doc.category.trim() }
});
counter = counter + 1;
if ( counter % 1000 == 0 ) {
bulk.execute();
bulk = db.collection.initializeOrderedBulkOp();
}
}
);
if ( counter > 1 )
bulk.execute();
सर्वश्रेष्ठ bulkWrite()
. के साथ किया गया आधुनिक एपीआई के लिए जो बल्क ऑपरेशंस एपीआई का उपयोग करता है (तकनीकी रूप से सब कुछ अब करता है) लेकिन वास्तव में एक तरह से जो सुरक्षित रूप से प्रतिगामी . है MongoDB के पुराने संस्करणों के साथ। हालांकि पूरी ईमानदारी से इसका मतलब होगा कि MongoDB 2.6 से पहले और आप ऐसे संस्करण का उपयोग करके आधिकारिक समर्थन विकल्पों के लिए कवरेज से बाहर होंगे। इसके लिए कोडिंग कुछ हद तक साफ है:
var batch = [];
db.collection.find({ "category": /^\s+|\s+$/ },{ "category": 1}).forEach(
function(doc) {
batch.push({
"updateOne": {
"filter": { "_id": doc._id },
"update": { "$set": { "category": doc.category.trim() } }
}
});
if ( batch.legth % 1000 == 0 ) {
db.collection.bulkWrite(batch);
batch = [];
}
}
);
if ( batch.length > 0 ) {
db.collection.bulkWrite(batch);
batch = [];
}
जो सभी केवल एक बार सर्वर को ऑपरेशन भेजते हैं प्रति 1000 दस्तावेज़, या 64एमबी बीएसओएन सीमा के अंतर्गत आप जितने संशोधन कर सकते हैं उतने संशोधन।
समस्या से संपर्क करने के कुछ ही तरीकों के रूप में। या आयात करने से पहले अपनी CSV फ़ाइल को पहले अपडेट करें।