Model.create() vs Model.collection.insert():un enfoque más rápido
Model.create()
es una mala manera de hacer inserciones si se trata de un volumen muy grande. Será muy lento . En ese caso deberías usar Model.collection.insert
, que funciona mucho mejor . Dependiendo del tamaño del bulto, Model.create()
incluso se estrellará! Intenté con un millón de documentos, sin suerte. Usando Model.collection.insert
solo tomó unos segundos.
Model.collection.insert(docs, options, callback)
docs
es la matriz de documentos que se insertarán;options
es un objeto de configuración opcional; consulte los documentoscallback(err, docs)
se llamará después de que se guarden todos los documentos o se produzca un error. En caso de éxito, docs es la matriz de documentos persistentes.
Como señala aquí el autor de Mongoose, este método omitirá cualquier procedimiento de validación y accederá directamente al controlador de Mongo. Es una compensación que debe hacer ya que está manejando una gran cantidad de datos; de lo contrario, no podría insertarlos en su base de datos (recuerde que estamos hablando de cientos de miles de documentos aquí).
Un ejemplo sencillo
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);
}
}
Actualización 2019-06-22 :aunque insert()
todavía se puede usar bien, ha quedado obsoleto a favor de insertMany()
. Los parámetros son exactamente los mismos, por lo que puede usarlo como un reemplazo directo y todo debería funcionar bien (bueno, el valor de retorno es un poco diferente, pero probablemente no lo esté usando de todos modos).
Referencia
- Documentación de Mongo
- Aaron Heckman en Grupos de Google sobre inserciones masivas