Model.create() vs Model.collection.insert() :une approche plus rapide
Model.create()
est une mauvaise façon de faire des inserts si vous avez affaire à un très gros volume. Ce sera très lent . Dans ce cas, vous devez utiliser Model.collection.insert
, qui fonctionne bien mieux . En fonction de la taille du bulk, Model.create()
va même planter ! J'ai essayé avec un million de documents, pas de chance. Utilisation de Model.collection.insert
cela n'a pris que quelques secondes.
Model.collection.insert(docs, options, callback)
docs
est le tableau des documents à insérer ;options
est un objet de configuration facultatif - voir la documentationcallback(err, docs)
sera appelé une fois que tous les documents auront été enregistrés ou qu'une erreur se produira. En cas de succès, docs est le tableau des documents persistants.
Comme l'auteur de Mongoose le souligne ici, cette méthode contournera toutes les procédures de validation et accédera directement au pilote Mongo. C'est un compromis que vous devez faire puisque vous manipulez une grande quantité de données, sinon vous ne seriez pas du tout en mesure de l'insérer dans votre base de données (rappelez-vous que nous parlons ici de centaines de milliers de documents).
Un exemple simple
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);
}
}
Mise à jour 2019-06-22 :bien que insert()
peut toujours être utilisé très bien, il a été déprécié en faveur de insertMany()
. Les paramètres sont exactement les mêmes, vous pouvez donc simplement l'utiliser en remplacement et tout devrait fonctionner correctement (enfin, la valeur de retour est un peu différente, mais vous ne l'utilisez probablement pas de toute façon).
Référence
- Documentation Mongo
- Aaron Heckman sur Google Groupes discute des insertions groupées