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

Bulk upsert i MongoDB ved hjælp af mongoose

Ikke i "mongoose" specifikt, eller i det mindste endnu ikke i skrivende stund. MongoDB-skallen fra 2.6-udgivelsen bruger faktisk "Bulk operations API" "under the hood" som det var for alle de generelle hjælpemetoder. I dens implementering forsøger den at gøre dette først, og hvis en ældre versionsserver opdages, er der en "tilbagegang" til den ældre implementering.

Alle mongoose-metoderne bruger "i øjeblikket" "legacy"-implementeringen eller skrivebekymringssvaret og de grundlæggende gamle metoder. Men der er en .collection accessor fra enhver given mongoose-model, der i det væsentlige får adgang til "samlingsobjektet" fra den underliggende "node native driver", som mongoose selv er implementeret på:

 var mongoose = require('mongoose'),
     Schema = mongoose.Schema;

 mongoose.connect('mongodb://localhost/test');

 var sampleSchema  = new Schema({},{ "strict": false });

 var Sample = mongoose.model( "Sample", sampleSchema, "sample" );

 mongoose.connection.on("open", function(err,conn) { 

    var bulk = Sample.collection.initializeOrderedBulkOp();
    var counter = 0;

    // representing a long loop
    for ( var x = 0; x < 100000; x++ ) {

        bulk.find(/* some search */).upsert().updateOne(
            /* update conditions */
        });
        counter++;

        if ( counter % 1000 == 0 )
            bulk.execute(function(err,result) {             
                bulk = Sample.collection.initializeOrderedBulkOp();
            });
    }

    if ( counter % 1000 != 0 )
        bulk.execute(function(err,result) {
           // maybe do something with result
        });

 });

Den største fangst der er, at "mongoose-metoder" faktisk er klar over, at en forbindelse faktisk ikke er oprettet endnu og "står i kø", indtil dette er fuldført. Den oprindelige driver, du "graver i", gør ikke denne skelnen.

Så du skal virkelig være opmærksom på, at forbindelsen er etableret på en eller anden måde eller form. Men du kan bruge de native driver-metoder, så længe du er forsigtig med, hvad du laver.



  1. Sådan bruges decimaltype i MongoDB

  2. MongoDB Schema Design - Mange små dokumenter eller færre store dokumenter?

  3. Import af data til en MongoDB-instans

  4. Indsættelse af et stort udvalg af objekter i mongodb fra nodejs