MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Upsert en masse dans MongoDB à l'aide de mangouste

Pas dans "mangouste" spécifiquement, ou du moins pas encore au moment de l'écriture. Le shell MongoDB à partir de la version 2.6 utilise en fait "l'API d'opérations en masse" "sous le capot" pour ainsi dire pour toutes les méthodes d'assistance générales. Dans son implémentation, il essaie de le faire en premier, et si une version plus ancienne du serveur est détectée, il y a un "retour" à l'implémentation héritée.

Toutes les méthodes de mangouste utilisent "actuellement" l'implémentation "héritée" ou la réponse de préoccupation d'écriture et les méthodes héritées de base. Mais il y a un .collection accesseur de n'importe quel modèle de mangouste donné qui accède essentiellement à "l'objet de collection" à partir du "pilote natif de nœud" sous-jacent sur lequel la mangouste est elle-même implémentée :

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

 });

Le principal hic étant que les "méthodes mangouste" sont en fait conscientes qu'une connexion peut ne pas encore être établie et "file d'attente" jusqu'à ce qu'elle soit terminée. Le pilote natif dans lequel vous "creusez" ne fait pas cette distinction.

Vous devez donc vraiment être conscient que la connexion est établie d'une manière ou d'une autre. Mais vous pouvez utiliser les méthodes de pilote natives tant que vous faites attention à ce que vous faites.