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

Mongoose (mongodb) Stapeleinfügung?

Model.create() vs. Model.collection.insert():ein schnellerer Ansatz

Model.create() ist ein schlechter Weg, Einlagen zu machen, wenn Sie es mit einer sehr großen Masse zu tun haben. Es wird sehr langsam sein . In diesem Fall sollten Sie Model.collection.insert verwenden , die viel besser abschneidet . Abhängig von der Größe des Bulks, Model.create() wird sogar abstürzen! Versucht mit einer Million Dokumenten, kein Glück. Verwenden von Model.collection.insert Es dauerte nur wenige Sekunden.

Model.collection.insert(docs, options, callback)
  • docs ist das Array der einzufügenden Dokumente;
  • options ist ein optionales Konfigurationsobjekt - siehe Dokumentation
  • callback(err, docs) wird aufgerufen, nachdem alle Dokumente gespeichert wurden oder ein Fehler auftritt. Bei Erfolg ist docs das Array der persistenten Dokumente.

Wie der Autor von Mongoose hier betont, umgeht diese Methode alle Validierungsverfahren und greift direkt auf den Mongo-Treiber zu. Es ist ein Kompromiss, den Sie eingehen müssen, da Sie mit einer großen Datenmenge umgehen, sonst könnten Sie sie überhaupt nicht in Ihre Datenbank einfügen (denken Sie daran, wir sprechen hier von Hunderttausenden von Dokumenten).

Ein einfaches Beispiel

var Potato = mongoose.model('Potato', PotatoSchema);

var potatoBag = [/* a humongous amount of potato objects */];

Potato.collection.insert(potatoBag, onInsert);

function onInsert(err, docs) {
    if (err) {
        // TODO: handle error
    } else {
        console.info('%d potatoes were successfully stored.', docs.length);
    }
}

Aktualisierung 22.06.2019 :obwohl insert() kann immer noch gut verwendet werden, es wurde zugunsten von insertMany() verworfen . Die Parameter sind genau die gleichen, also kannst du es einfach als Drop-in-Ersatz verwenden und alles sollte gut funktionieren (naja, der Rückgabewert ist ein bisschen anders, aber du benutzt es wahrscheinlich sowieso nicht).

Referenz

  • Mongo-Dokumentation
  • Aaron Heckman diskutiert in Google Groups über Bulk Inserts