Z pewnością, jeśli wszystko, co chcesz zrobić, to usunąć
elementy z tekstu, po prostu dopasuj globalnie i zamień:
db.tests.find({ "name": /\ /g }).forEach(function(doc) {
doc.name = doc.name.replace(/ /g,"");
db.tests.update({ "_id": doc._id },{ "$set": { "name": doc.name } });
});
Więc nie powinno być potrzeby zapisywania każdej kombinacji, wyrażenie regularne zastąpi bardzo dopasowanie /g
opcja. Ewentualnie użyj także /m
dla multi-line to twój ciąg "name" zawiera znaki nowej linii. Zobacz podstawowy przykład regexera
.
Zaleca się również użycie $set
aby modyfikować tylko pola, które naprawdę chcesz, a nie .save()
cały dokument z powrotem. Jest mniejszy ruch i mniejsza szansa na nadpisanie zmian, które mogły zostać wprowadzone przez inny proces od czasu przeczytania dokumentu.
Idealnie byłoby używać interfejsu Bulk Operations API z MongoDB w wersji 2.6 i nowszych. Dzięki temu aktualizacje są „wsadowe”, dzięki czemu ruch między klientem a serwerem jest ponownie mniejszy:
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 są twoje główne sposoby na poprawę tego. Niestety nie ma możliwości, aby instrukcja aktualizacji MongoDB użyła w ten sposób istniejącej wartości jako części wyrażenia aktualizacji, więc jedynym sposobem jest pętla, ale możesz wiele zrobić, aby zmniejszyć liczbę operacji, jak pokazano.