sql >> Databasteknik >  >> NoSQL >> MongoDB

Mongo bulk hitta och uppdatera matchade dokumentfält i en enda fråga?

För förbättrad prestanda, dra fördel av att använda en Bulk() API för att uppdatera samlingen effektivt i bulk eftersom du kommer att skicka operationerna till servern i omgångar (exempelvis en batchstorlek på 500). Detta ger dig mycket bättre prestanda eftersom du inte kommer att skicka varje begäran till servern utan bara en gång av 500 förfrågningar, vilket gör dina uppdateringar mer effektiva och snabbare.

Följande visar detta tillvägagångssätt, det första exemplet använder Bulk() API tillgängligt i MongoDB-versioner>=2.6 och <3.2. Den uppdaterar alla matchade dokument i samlingen från en given array genom att öka 1 till det visade fältet. Det förutsätter att bilduppsättningen 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 och <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(); }

Nästa exempel gäller den nya MongoDB version 3.2 som sedan dess har fasat ut Bulk() API och tillhandahöll en nyare uppsättning apis med bulkWrite() .

MongoDB version 3.2 och senare :

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. Hur använder jag en guide i en mongodb-skalfråga

  2. Uppdatera en kapslad array med MongoDB

  3. mongo - kunde inte ansluta till server 127.0.0.1:27017

  4. Behöver en lösning för att slå upp en sträng till objectID outsiderField