¿ Mongoose v3.6 + admite inserciones por lotes ahora? He buscado durante unos minutos, pero cualquier cosa que coincida con esta consulta tiene un par de años y la respuesta fue un rotundo no.
Editar:
Para referencia futura, la respuesta es usar Model.create()
. create()
acepta una matriz como primer argumento, por lo que puede pasar sus documentos para que se inserten como una matriz.
Consulte la documentación de Model.create ()
Respuestas:
Model.create () vs Model.collection.insert (): un enfoque más rápido
Model.create()
es una mala forma de hacer inserciones si se trata de un volumen muy grande. Será muy lento . En ese caso debería utilizarModel.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. UsarloModel.collection.insert
tomó solo unos segundos.docs
es el conjunto 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 el conjunto de documentos persistentes.Como señala aquí el autor de Mongoose , este método evitará 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 simple ejemplo
Actualización 2019-06-22 : aunque
insert()
todavía se puede usar sin problemas, ha quedado obsoleto en favor deinsertMany()
. 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
fuente
Model.collection
pasa directamente por el controlador Mongo, pierde todas las cosas ordenadas de la mangosta, incluida la validación y los ganchos. Sólo algo para tener en cuenta.Model.create
pierde los ganchos, pero aún pasa por la validación. Si lo quieres todo, debes iterar ynew MyModel()
Mongoose 4.4.0 ahora admite inserción a granel
Mongoose 4.4.0 introduce --verdadero-- inserto a granel con el método modelo
.insertMany()
. Es mucho más rápido que realizar un bucle.create()
o proporcionarle una matriz.Uso:
O
Puedes rastrearlo en:
fuente
bulkWrite
? Vea aquí: stackoverflow.com/questions/38742475/…fatal error allocation failed
. Pero si uso collection.insert Funciona perfectamente.dateCreated : { type: Date, default: Date.now },
De hecho, puede usar el método "crear" de Mongoose, puede contener una variedad de documentos, vea este ejemplo:
La función de devolución de llamada contiene los documentos insertados. No siempre sabe cuántos elementos deben insertarse (longitud de argumento fija como el anterior) para que pueda recorrerlos:
Actualización: una mejor solución
Una mejor solución sería usar en
Candy.collection.insert()
lugar deCandy.create()
usar en el ejemplo anterior, porque es más rápido (create()
está llamandoModel.save()
a cada elemento, por lo que es más lento).Consulte la documentación de Mongo para obtener más información: http://docs.mongodb.org/manual/reference/method/db.collection.insert/
(gracias a arcseldon por señalar esto)
fuente
{type:'jellybean'}
lugar de{type:'jelly bean'}
? Por cierto. ¿Qué tipos extraños son esos? ¿Son parte de la API de Mongoose?type
que generalmente está reservado en Mongoose para denominar el ADT de un objeto de base de datos.Puede realizar una inserción masiva usando mongoDB shell usando la inserción de los valores en una matriz.
fuente
YourModel.collection.insert()
collection.insert
respuesta en bruto se dio unas semanas antes de esta respuesta y se explicó con mucho más detalle.Puede realizar una inserción masiva utilizando mangosta, como la respuesta de mayor puntuación. Pero el ejemplo no puede funcionar, debería ser:
No use una instancia de esquema para la inserción masiva, debe usar un objeto de mapa simple.
fuente
Aquí están las dos formas de guardar datos con insertMany y save
1) Mongoose guarda una variedad de documentos a
insertMany
granel2) Mongoose guardar una serie de documentos con
.save()
Estos documentos se guardarán en paralelo.
fuente
Parece que al usar mangosta hay un límite de más de 1000 documentos, cuando se usa
Puedes usar:
Pero esto es casi el doble de rápido cuando se prueba con 10000 documentos:
fuente
Compartiendo código de trabajo y relevante de nuestro proyecto:
fuente
.insertMany
solución ya se dio (y se explicó) en esta respuesta de 2016 .