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

Upsert in blocco in MongoDB usando mongoose

Non in "mangusta" in particolare, o almeno non ancora al momento della scrittura. La shell MongoDB a partire dalla versione 2.6 utilizza effettivamente "l'API per le operazioni in blocco" "sotto il cofano" come lo era per tutti i metodi di supporto generali. Nella sua implementazione, prova a farlo prima e se viene rilevata una versione precedente del server, c'è un "fallback" nell'implementazione legacy.

Tutti i metodi mangusta "attualmente" utilizzano l'implementazione "legacy" o la risposta alla preoccupazione di scrittura e i metodi legacy di base. Ma c'è un .collection accessor da qualsiasi modello mongoose che essenzialmente accede all '"oggetto raccolta" dal "driver nativo del nodo" sottostante su cui è implementato mongoose stesso:

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

 });

Il problema principale è che i "metodi mangusta" sono in realtà consapevoli che una connessione potrebbe non essere ancora stata stabilita e "coda" fino a quando non viene completata. Il driver nativo in cui stai "scavando" non fa questa distinzione.

Quindi devi davvero essere consapevole che la connessione è stabilita in qualche modo o forma. Ma puoi usare i metodi del driver nativo purché tu stia attento a quello che stai facendo.