Разбира се, ако всичко, което искате да направите, е да премахнете
обекти от вашия текст, тогава просто правите глобално съответствие и заменяте:
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
за многоредов низът ви "име" съдържа знаци за нов ред. Вижте основен пример за regexer
.
Също така се препоръчва да използвате $setкод>
за да промените само полето(ята), което наистина искате, вместо .save()
целият документ обратно. Има по-малко трафик и по-малък шанс за презаписване на промени, които може да са направени от друг процес след прочитането на документа.
В идеалния случай бихте използвали API за групови операции с MongoDB версии 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 да използва съществуваща стойност като част от своя израз за актуализиране по този начин, така че единственият начин е зацикляне, но можете да направите много, за да намалите операциите, както е показано.