Model.create() vs Model.collection.insert():een snellere aanpak
Model.create()
is een slechte manier om inserts te doen als je te maken hebt met een zeer grote bulk. Het zal erg langzaam zijn . Gebruik in dat geval Model.collection.insert
, die veel beter presteert . Afhankelijk van de grootte van de bulk, Model.create()
zal zelfs crashen! Geprobeerd met een miljoen documenten, geen geluk. Model.collection.insert
gebruiken het duurde maar een paar seconden.
Model.collection.insert(docs, options, callback)
docs
is de reeks documenten die moet worden ingevoegd;options
is een optioneel configuratie-object - zie de documentencallback(err, docs)
wordt aangeroepen nadat alle documenten zijn opgeslagen of er treedt een fout op. Bij succes, docs is de reeks van persistente documenten.
Zoals de auteur van Mongoose hier aangeeft, zal deze methode alle validatieprocedures omzeilen en rechtstreeks toegang krijgen tot de Mongo-driver. Het is een afweging die je moet maken omdat je een grote hoeveelheid gegevens verwerkt, anders zou je het helemaal niet in je database kunnen invoegen (onthoud dat we het hier over honderdduizenden documenten hebben).
Een eenvoudig voorbeeld
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);
}
}
Update 22-06-2019 :hoewel insert()
kan nog steeds prima worden gebruikt, het is afgeschaft ten gunste van insertMany()
. De parameters zijn precies hetzelfde, dus je kunt het gewoon gebruiken als een drop-in vervanging en alles zou prima moeten werken (nou ja, de retourwaarde is een beetje anders, maar je gebruikt het waarschijnlijk toch niet).
Referentie
- Mongo-documentatie
- Aaron Heckman op Google Discussiegroepen over bulkinvoegingen