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

Saml og opdater MongoDB

For forbedret ydeevne, især når du har at gøre med store samlinger, drag fordel af at bruge Bulk() API til masseopdateringer, da du vil sende operationerne til serveren i batches (f.eks. f.eks. en batchstørrelse på 1000), hvilket giver dig meget bedre ydeevne, da du ikke vil sende alle anmodninger til serveren (som du pt. gør med opdateringserklæringen i forEach() loop), men kun én gang for hver 1000 anmodninger, hvilket gør dine opdateringer mere effektive og hurtigere, end det er i øjeblikket.

Følgende eksempler demonstrerer denne tilgang, det første bruger Bulk() API tilgængelig i MongoDB versioner >= 2.6 and < 3.2 . Den opdaterer alle dokumenter i clients indsamling ved at ændre nb_orders_1year felter med værdier fra aggregeringsresultaterne.

Siden aggregate() metode returnerer en cursor , Du kan bruge aggregeringsoutputsamlingens forEach() metode til at iterere det og få adgang til hvert dokument, således at opsætte bulkopdateringsoperationerne i batches for derefter at sende på tværs af serveren effektivt med API'en:

var bulk = db.clients.initializeUnorderedBulkOp(),
    pipeline = [
        {
            "$match": { "date_order": { "$gt": v_date1year } }
        },
        {
            "$group": {
                "_id": "$id_client", 
                "count": { "$sum" : 1 }
            }
        },
        { "$out": "tmp_indicators" }        
    ],
    counter = 0;

db.orders.aggregate(pipeline);  
db.tmp_indicators.find().forEach(function (doc) {       
    bulk.find({ "_id": doc._id }).updateOne({ 
        "$set": { "nb_orders_1year": doc.count }
    });

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

Det næste eksempel gælder for den nye MongoDB-version 3.2 som siden har afskrevet hovedparten API og leverede et nyere sæt apis ved hjælp af bulkWrite() .

Den bruger den samme markør som ovenfor, men i stedet for at iterere resultatet, skal du oprette arrayet med bulk-handlingerne ved at bruge dens map() metode:

 var pipeline = [
        {
            "$match": { "date_order": { "$gt": v_date1year } }
        },
        {
            "$group": {
                "_id": "$id_client", 
                "count": { "$sum" : 1 }
            }
        },
        { "$out": "tmp_indicators" }        
    ];
db.orders.aggregate(pipeline);
var bulkOps = db.tmp_indicators.find().map(function (doc) { 
        return { 
            "updateOne": { 
                "filter": { "_id": doc._id } ,              
                "update": { "$set": { "nb_orders_1year": doc.count } } 
            }         
        };
    });

db.clients.bulkWrite(bulkOps, { "ordered": true });



  1. MongoDB Shell - adgang til samling med punktum i navnet?

  2. Spring Session Data Redis - Få gyldige sessioner, nuværende bruger fra Redis Store

  3. Rediger og gentag MongoDB oplog

  4. Findes der en MongoDB maksimal bson-størrelse?