sql >> Database teknologi >  >> NoSQL >> MongoDB

Mongo bulk finde og opdatere matchede dokumentfelt i en enkelt forespørgsel?

For forbedret ydeevne skal du udnytte en Bulk() API til at opdatere samlingen effektivt i bulk, da du vil sende operationerne til serveren i batches (f.eks. f.eks. en batchstørrelse på 500). Dette giver dig meget bedre ydeevne, da du ikke sender alle anmodninger til serveren, men kun én gang for hver 500 anmodninger, hvilket gør dine opdateringer mere effektive og hurtigere.

Det følgende demonstrerer denne tilgang, det første eksempel bruger Bulk() API tilgængelig i MongoDB-versioner>=2.6 og <3.2. Den opdaterer alle matchede dokumenter i samlingen fra en given matrix ved at øge 1 til det viste felt. Det antager, at rækken af ​​billeder har strukturen

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" }
]

MongoDB-versioner>=2.6 og <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(); }

Det næste eksempel gælder for den nye MongoDB version 3.2, som siden har forældet Bulk() API og leverede et nyere sæt API'er ved hjælp af bulkWrite() .

MongoDB version 3.2 og nyere :

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. Redis - Opret forbindelse til fjernserver

  2. Redis og Node.js og Socket.io spørgsmål

  3. Er der en måde at automatisk opdage ny klynge node IP i Redis Cluster med salat

  4. Blanding af PostgreSQL og MongoDB (som Django-backends)