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

Come utilizzare l'inserimento in blocco non ordinato con Mongoskin?

Puoi farlo ma devi modificare le convenzioni di chiamata per farlo poiché solo il modulo "callback" restituirà effettivamente un oggetto raccolta da cui .initializeUnorderedBulkOp() è possibile chiamare il metodo. Ci sono anche alcune differenze di utilizzo rispetto a come pensi che funzioni:

var dbURI = urigoeshere;
var db = mongo.db(dbURI, {safe:true});
db.collection('collection',function(err,collection) {
    var bulk = collection.initializeUnorderedBulkOp();
    count = 0;

    for (var i = 0; i < 200000; i++) {
        bulk.insert({number: i});
        count++;

        if ( count % 1000 == 0 )
            bulk.execute(function(err,result) {
               // maybe do something with results
               bulk = collection.initializeUnorderedBulkOp(); // reset after execute
            });      

    });

    // If your loop was not a round divisor of 1000
    if ( count % 1000 != 0 )
        bulk.execute(function(err,result) {
          // maybe do something here
        });
});

Quindi i metodi "Bulk" effettivi stessi non richiedono callback e funzionano esattamente come mostrato nella documentazione. L'eccezione è .execute() che invia effettivamente le istruzioni al server.

Anche se il driver risolverà in qualche modo questo problema, probabilmente non è una buona idea mettere in coda troppe operazioni prima di chiamare execute. Questo sostanzialmente si accumula nella memoria e, sebbene il driver invierà solo batch di 1000 alla volta (questo è un limite del server e il batch completo è inferiore a 16 MB), probabilmente vorrai un po 'più di controllo qui, almeno per limitare l'utilizzo della memoria.

Questo è il punto dei test modulo come mostrato, ma se la memoria per la creazione delle operazioni e un oggetto di risposta possibilmente molto grande non sono un problema per te, puoi semplicemente continuare a mettere in coda le operazioni e chiamare .execute() una volta.

La "risposta" è nello stesso formato fornito nella documentazione per BulkWriteResult.