sql >> Database >  >> NoSQL >> MongoDB

Bulk upsert in MongoDB met behulp van mangoest

Niet specifiek in "mangoest", of in ieder geval nog niet op het moment van schrijven. De MongoDB-shell vanaf de 2.6-release gebruikt eigenlijk de "Bulk operations API" "onder de motorkap" als het ware voor alle algemene hulpmethoden. In zijn implementatie probeert het dit eerst te doen, en als een oudere versieserver wordt gedetecteerd, is er een "terugval" naar de legacy-implementatie.

Alle mangoest-methoden gebruiken "momenteel" de "legacy"-implementatie of de write concern-respons en de basis legacy-methoden. Maar er is een .collection accessor van een bepaald mangoestmodel dat in wezen toegang heeft tot het "verzamelobject" van de onderliggende "node native driver" waarop mangoest zelf is geïmplementeerd:

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

 });

De belangrijkste vangst daarbij is dat "mongoose-methoden" zich er feitelijk van bewust zijn dat er mogelijk nog geen verbinding tot stand is gebracht en "in de wachtrij staan" totdat dit voltooid is. De native driver waar je in duikt, maakt dit onderscheid niet.

Je moet je er dus echt van bewust zijn dat de verbinding op de een of andere manier tot stand komt. Maar je kunt de native driver-methoden gebruiken zolang je voorzichtig bent met wat je doet.



  1. Maakt de Rentalis Redis-bibliotheek zijn eigen thread voor asynchrone callbacks?

  2. Voorbeeld om socket.io-redis . te gebruiken

  3. Multifield-indexen maken in Mongoose / MongoDB

  4. Hoe krijg ik een specifiek ingesloten document in een MongoDB-verzameling?