sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Inserción de lote de mangosta (mongodb)?

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 documentos
  • callback(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