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 Dokumentationcallback(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