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

Wie verwende ich ungeordnetes Masseneinfügen mit Mongoskin?

Sie können dies tun, aber Sie müssen dazu Ihre Aufrufkonventionen ändern, da nur das "Callback"-Formular tatsächlich ein Sammlungsobjekt zurückgibt, aus dem die .initializeUnorderedBulkOp() Methode aufgerufen werden kann. Es gibt auch einige Verwendungsunterschiede dazu, wie Sie denken, dass dies funktioniert:

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

Die eigentlichen "Massen"-Methoden selbst erfordern also keine Rückrufe und funktionieren genau wie in der Dokumentation gezeigt. Die Ausnahme ist .execute() der die Anweisungen tatsächlich an den Server sendet.

Obwohl der Treiber dies etwas für Sie regeln wird, ist es wahrscheinlich keine gute Idee, zu viele Operationen in die Warteschlange zu stellen, bevor Sie execute aufrufen. Dies baut sich im Grunde genommen im Speicher auf, und obwohl der Treiber nur Stapel von 1000 auf einmal sendet (dies ist eine Servergrenze, da der vollständige Stapel unter 16 MB liegt), möchten Sie hier wahrscheinlich zumindest etwas mehr Kontrolle haben Speichernutzung begrenzen.

Das ist der Punkt der Modulo-Tests, wie gezeigt, aber wenn der Speicher zum Erstellen der Operationen und ein möglicherweise sehr großes Antwortobjekt kein Problem für Sie sind, können Sie einfach die Operationen in die Warteschlange stellen und .execute() einmal.

Die "Antwort" hat das gleiche Format wie in der Dokumentation für BulkWriteResult angegeben.