sql >> Databáze >  >> NoSQL >> MongoDB

Najděte a nahraďte řetězce v dokumentech efektivně

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.



  1. Počet dokumentů Mongodb

  2. Je třeba sečíst z hodnoty objektu pole v mongodb

  3. Spring mongodb získá ID vložené položky po uložení

  4. Mongoose:Jak získat statistiku nahraných dat za posledních 7 dní z DB?