sql >> Database >  >> NoSQL >> MongoDB

Strings in documenten efficiënt zoeken en vervangen

Zeker als je alleen de   . wilt verwijderen entiteiten uit je tekst, dan doe je gewoon een globale match en vervang je:

db.tests.find({ "name": /\ /g }).forEach(function(doc) {
    doc.name = doc.name.replace(/ /g,"");
    db.tests.update({ "_id": doc._id },{ "$set": { "name": doc.name } });
});

Het zou dus niet nodig moeten zijn om elke combinatie weg te schrijven, de regex zal very match vervangen door de /g keuze. Gebruik eventueel ook /m voor multi-line is uw "naam" string bevat newline karakters. Bekijk een eenvoudig regexer-voorbeeld .

Het wordt ook aanbevolen om $set om alleen de velden te wijzigen die u echt wilt in plaats van .save() het hele document terug. Er is minder verkeer en minder kans op het overschrijven van wijzigingen die mogelijk door een ander proces zijn aangebracht sinds het document is gelezen.

Idealiter zou u de Bulk Operations API gebruiken met MongoDB-versies 2.6 en hoger. Hierdoor kunnen de updates "batch" zodat er weer minder verkeer is tussen de client en de server:

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();

Dat zijn uw belangrijkste manieren om dit te verbeteren. Helaas is er geen manier voor een MongoDB-update-instructie om op deze manier een bestaande waarde te gebruiken als onderdeel van de update-expressie, dus de enige manier is looping, maar u kunt veel doen om de bewerkingen te verminderen, zoals wordt getoond.



  1. MongoDB $bsonSize

  2. Hoe stel ik de MongoDB-database in op Heroku met MongoLab?

  3. MongoDB - Toestemming geweigerd voor socket:/tmp/mongodb-27017.sock

  4. Docker-compose , toch om een ​​redis.conf-bestand op te geven?