MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Bulk-Upsert in MongoDB mit Mongoose

Nicht speziell in "Mongoose" oder zumindest noch nicht zum Zeitpunkt des Schreibens. Die MongoDB-Shell ab Version 2.6 verwendet tatsächlich die "Bulk Operations API" "unter der Haube", sozusagen für alle allgemeinen Hilfsmethoden. In seiner Implementierung versucht es dies zuerst, und wenn eine ältere Serverversion erkannt wird, gibt es einen "Fallback" zur Legacy-Implementierung.

Alle Mongoose-Methoden verwenden "derzeit" die "Legacy"-Implementierung oder die Write-Concern-Response und die grundlegenden Legacy-Methoden. Aber es gibt eine .collection Accessor von jedem gegebenen Mongoose-Modell, das im Wesentlichen auf das "Sammlungsobjekt" des zugrunde liegenden "nativen Knotentreibers" zugreift, auf dem Mongoose selbst implementiert ist:

 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
        });

 });

Der größte Haken dabei ist, dass "Mungo-Methoden" tatsächlich wissen, dass eine Verbindung möglicherweise noch nicht hergestellt wird, und "anstehen", bis dies abgeschlossen ist. Der native Treiber, in den Sie "eintauchen", macht diese Unterscheidung nicht.

Sie müssen sich also wirklich bewusst sein, dass die Verbindung auf irgendeine Weise oder Form hergestellt wird. Aber Sie können die nativen Treibermethoden verwenden, solange Sie vorsichtig sind mit dem, was Sie tun.