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

MongoDB:Kopiering af et array til et andet array i det samme dokument

For relativt små data kan du opnå ovenstående ved at iterere samlingen ved hjælp af et snapshot med markørens forEach() metode og opdatering af hvert dokument som følger:

db.wholesalers.find({ 
    "brands": { "$exists": true, "$type": 4 } 
}).snapshot().forEach(function(doc){ 
    db.wholesalers.updateOne(
        { "_id": doc._id },
        { "$set": { "brandsNetherlands": doc.brands } }
    );
});

Selvom dette er optimalt for små samlinger, er ydeevnen med store samlinger stærkt reduceret, da loop gennem et stort datasæt og afsendelse af hver opdateringshandling pr. anmodning til serveren medfører en beregningsmæssig straf.

Bulk() API kommer til undsætning og forbedrer ydeevnen betydeligt, da skrivehandlinger kun sendes til serveren én gang i bulk. Effektivitet opnås, da metoden ikke sender hver skriveanmodning til serveren (som med den aktuelle opdateringserklæring i forEach() loop), men kun én gang for hver 1.000 anmodninger, hvilket gør opdateringer mere effektive og hurtigere end i øjeblikket.

Brug af samme koncept ovenfor med forEach() sløjfe for at oprette batchene, kan vi opdatere samlingen i bulk som følger.

I denne demonstration er Bulk() API tilgængelig i MongoDB versioner >= 2.6 and < 3.2 bruger initializeUnorderedBulkOp() metode til at udføre parallelt, såvel som i en ikke-deterministisk rækkefølge, skriveoperationerne i batchene:

var bulk =db.wholesalers.initializeUorderedBulkOp(),tæller =0; // tæller for at holde styr på batchopdateringsstørrelsen

db.wholesalers.find({ 
    "brands": { "$exists": true, "$type": 4 } 
}).snapshot().forEach(function(doc){ 

    bulk.find({ "_id": doc._id }).updateOne({ 
        "$set": { "brandsNetherlands": doc.brands } 
    });

    counter++; // increment counter
    if (counter % 1000 == 0) {
        bulk.execute(); // Execute per 1000 operations and re-initialize every 1000 update statements
        bulk = db.wholesalers.initializeUnorderedBulkOp();
    }
});

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

Den bruger de samme markører som ovenfor, men opretter arrays med bulk-operationerne ved hjælp af den samme forEach() markørmetode til at skubbe hvert bulk-skrivedokument til arrayet. Fordi skrivekommandoer ikke kan acceptere mere end 1000 operationer, er der behov for at gruppere operationer for at have højst 1000 operationer og gen-intialisere arrayet, når løkken rammer 1000 iterationen:

var cursor = db.wholesalers.find({
         "brands": { "$exists": true, "$type": 4 } 
    }),
    bulkUpdateOps = [];

cursor.snapshot().forEach(function(doc){ 
    bulkUpdateOps.push({ 
        "updateOne": {
            "filter": { "_id": doc._id },
            "update": { "$set": { "brandsNetherlands": doc.brands } }
         }
    });

    if (bulkUpdateOps.length === 1000) {
        db.wholesalers.bulkWrite(bulkUpdateOps);
        bulkUpdateOps = [];
    }
});         

if (bulkUpdateOps.length > 0) { db.wholesalers.bulkWrite(bulkUpdateOps); }



  1. Hvordan virker redis for at hjælpe i session persistens i azurblå vindue

  2. resque-scheduler mislykkes ved jobfjernelse

  3. Find og tæl elementer i samlingen med Mongoose

  4. Sådan spores MongoDB-anmodninger fra en konsolapplikation