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

Aktualizujte všechny prvky v poli v mongodb

Jak již bylo zmíněno, hlavním problémem je zde aktualizace více prvků s pozičním operátorem, jak je zaznamenáno v tomto dlouhodobém vydání:http://jira.mongodb.org/browse/SERVER-1243

Základním případem proto je, že to nemůže udělat jediné spuštění, takže pro zpracování více prvků pole potřebujete nějakou metodu, jak určit, kolik prvků potřebujete aktualizovat a zpracovat jeden příkaz aktualizace pro každý prvek.

Zjednodušeným přístupem je obecně použití Hromadné operace zpracovat to, co skončí jako „vícenásobné“ aktualizační operace jako jediný požadavek a odpověď na server:

var bulk = db.collection.initializeOrderedBulkOp(),
    count = 0;

db.collection.find({ "name": "John Doe", "adds.status": "PENDING" }).forEach(function(doc) { 
    doc.adds.filter(function(add){ return add.status = "PENDING" }).forEach(function(add) {
        bulk.find({ "_id": doc._id, "adds.status": "PENDING" }).updateOne({
            "$set": { "adds.$.status": "APPROVED" }
        });
        count++;

        // Execute once in 1000 statements created and re-init
        if ( count % 1000 == 0 ) {
            bulk.execute();
            bulk = db.collection.initializeOrderedBulkOp();
        }
    });
});

// Execute any pending operations
if ( count % 1000 != 0 )
    bulk.execute();

Pokud jsou vaše aktualizované dokumenty poměrně malé nebo skutečně pouze jeden dokument, můžete se count vzdát zkontrolujte a jednoduše připojte všechny hromadné aktualizace v rámci požadovaných smyček a na konci všech smyček je spusťte pouze jednou.

Delší vysvětlení a alternativy lze nalézt na stránce Jak aktualizovat více prvků pole , ale všechny se týkají různých přístupů k přiřazování prvku k aktualizaci a zpracování poziční $ aktualizujte vícekrát, buď pro každý odpovídající dokument, nebo dokud nebudou vráceny žádné další upravené dokumenty.




  1. Najděte poslední dokument dne za posledních 7 dní

  2. syntaxe pro propojení dokumentů v mongodb

  3. Použití $$ROOT v agregačním pořadí

  4. Tipy pro plánování schématu MongoDB