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

Mongo hromadně najít a aktualizovat pole shodných dokumentů v jediném dotazu?

Chcete-li dosáhnout lepšího výkonu, využijte výhod použití Bulk() API pro efektivní hromadnou aktualizaci kolekce, protože operace budete odesílat na server v dávkách (například řekněme o velikosti dávky 500). Díky tomu získáte mnohem lepší výkon, protože nebudete na server posílat každý požadavek, ale pouze jednou za 500 požadavků, takže vaše aktualizace budou efektivnější a rychlejší.

Následující příklad demonstruje tento přístup, první příklad používá Bulk() API dostupné ve verzích MongoDB>=2.6 a <3.2. Aktualizuje všechny odpovídající dokumenty v kolekci z daného pole zvýšením 1 do zobrazeného pole. Předpokládá, že pole obrázků má strukturu

var images = [
    { "_id": 1, "name": "img_1.png" },
    { "_id": 2, "name": "img_2.png" }
    { "_id": 3, "name": "img_3.png" },
    ...
    { "_id": n, "name": "img_n.png" }
]

Verze MongoDB>=2.6 a <3.2 :

var bulk = db.images.initializeUnorderedBulkOp(),
    counter = 0;

images.forEach(function (doc) {    
    bulk.find({ "_id": doc._id }).updateOne({ 
        "$inc": { "shown": 1 }
    });

    counter++;
    if (counter % 500 === 0) {
        // Execute per 500 operations
        bulk.execute(); 
        // re-initialize every 500 update statements
        bulk = db.images.initializeUnorderedBulkOp();
    }
})
// Clean up remaining queue
if (counter % 500 !== 0) { bulk.execute(); }

Další příklad platí pro novou verzi MongoDB 3.2, která od té doby zavrhla Bulk() API a poskytla novější sadu API pomocí bulkWrite() .

MongoDB verze 3.2 a vyšší :

var ops = [];
images.forEach(function(doc) {
    ops.push({
        "updateOne": {
            "filter": { "_id": doc._id },
            "update": {
                "$inc": { "shown": 1 }
            }
        }
    });

    if (ops.length === 500 ) {
        db.images.bulkWrite(ops);
        ops = [];
    }
})

if (ops.length > 0)  
    db.images.bulkWrite(ops);



  1. Spring Data MongoDB - Anotace @CreatedDate nefunguje při použití s ​​vlastním polem ID

  2. Omezujete výsledky v MongoDB, ale stále získáváte plný počet?

  3. MongoDB duplikuje dokumenty i po přidání jedinečného klíče

  4. Filtrování vložených dokumentů v MongoDB