Понастоящем не е възможно актуализация в 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
което ви е необходимо само в MongoDB, където множество условия биха били приложени към едно и също поле. В противен случай $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);
Или дори с API за групови операции за MongoDB 2.6 и по-нова версия:
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()
за съвременни API, които използват API за групови операции (технически всичко прави сега ), но всъщност по начин, който е безопасно регресивен с по-стари версии на 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 документа или толкова модификации, колкото можете да поберете под ограничението от 64MB BSON.
Като само няколко начина за подход към проблема. Или първо актуализирайте своя CSV файл, преди да импортирате.