Jistě, pokud vše, co chcete udělat, je odstranit
entity z vašeho textu, pak stačí provést globální shodu a nahradit:
db.tests.find({ "name": /\ /g }).forEach(function(doc) {
doc.name = doc.name.replace(/ /g,"");
db.tests.update({ "_id": doc._id },{ "$set": { "name": doc.name } });
});
Takže by nemělo být potřeba vypisovat každou kombinaci, regulární výraz nahradí velmi shodu s /g
volba. Případně také použijte /m
pro víceřádkový je váš řetězec "name" obsahuje znaky nového řádku. Podívejte se na základní příklad regexeru
.
Doporučuje se také použít $set
abyste mohli upravit pouze pole, která skutečně chcete, spíše než .save()
celý dokument zpět. Od přečtení dokumentu je menší provoz a menší šance na přepsání změn, které mohly být provedeny jiným procesem.
V ideálním případě byste použili API pro hromadné operace s MongoDB verze 2.6 a vyšší. To umožňuje aktualizace "dávkovat", takže je opět menší provoz mezi klientem a serverem:
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();
To jsou vaše hlavní způsoby, jak to zlepšit. Bohužel neexistuje způsob, jak by příkaz aktualizace MongoDB mohl tímto způsobem použít existující hodnotu jako součást svého aktualizačního výrazu, takže jediným způsobem je smyčkování, ale můžete udělat hodně pro omezení operací, jak je znázorněno.