MongoDB con controladores
Esta página documenta una mongosh . Para ver el método equivalente en un driver de MongoDB, se debe consultar la página correspondiente al lenguaje de programación:
Nota
Nuevo comando de escritura masiva en MongoDB 8.0
A partir de MongoDB 8.0, puedes usar el Mongo.bulkWrite()
mongosh Método para realizar escrituras masivas en múltiples bases de datos y colecciones. Para obtener más información sobre los diferentes métodos y comandos de escritura masiva, consulte Operaciones de escritura masiva.
Definición
db.collection.bulkWrite()Realiza varias operaciones de escritura en una colección, con controles para el orden de ejecución.
Devuelve: - Un valor booleano
acknowledgedcomotruesi la operación se ejecutó con nivel de confirmación de escritura ofalsesi el nivel de confirmación de escritura estaba desactivado. - Un conteo para cada operación de guardado.
- Un arreglo que contiene un
_idpara cada documento insertado o actualizado con éxito.
- Un valor booleano
Compatibilidad
db.collection.bulkWrite() está disponible en implementaciones alojadas en los siguientes entornos:
MongoDB Atlas: El servicio totalmente gestionado para implementaciones de MongoDB en la nube
Nota
Este comando es compatible con todos los clústeres de MongoDB Atlas. Para obtener información sobre el soporte de Atlas para todos los comandos, consulte Comandos no compatibles.
MongoDB Enterprise: La versión basada en suscripción y autogestionada de MongoDB
MongoDB Community: La versión de MongoDB con código fuente disponible, de uso gratuito y autogestionada.
Nota
No puede realizar operaciones de guardado masivo en la Interfaz de Usuario de Atlas. Para insertar varios documentos, debe insertar un arreglo de documentos. Para aprender más, consulte Crear, Ver, Actualizar y Borrar Documentos en la documentación de Atlas.
Sintaxis
El método bulkWrite() tiene la siguiente forma:
db.collection.bulkWrite( [ <operation 1>, <operation 2>, ... ], { writeConcern : <document>, ordered : <boolean> } )
Parámetros
El método bulkWrite() acepta los siguientes parámetros:
Parameter | Tipo | Descripción | ||
|---|---|---|---|---|
| arreglo | Una matriz de Las operaciones válidas son: Consulte Operaciones de escritura para obtener información sobre el uso de cada operación. | ||
| Documento | Opcional. Un documento que expresa el nivel de confirmación de escritura. Omite el uso del nivel de confirmación de escritura por defecto. No establezcas explícitamente el nivel de confirmación de escritura para la operación si se ejecuta en una transacción. Para usar el nivel de confirmación de escritura con transacciones, consulta Transacciones y nivel de confirmación de escritura. | ||
| booleano | Opcional. Un valor booleano que especifica si las operaciones se ejecutan en serie ( |
Comportamiento
bulkWrite() Toma una matriz de operaciones de escritura y ejecuta cada una de ellas. Por defecto, las operaciones se ejecutan en orden. Consulte Ejecución de Operaciones para controlar el orden de ejecución de las operaciones de escritura.
Operaciones de escritura
insertOne
Inserta un único documento en la colección.
db.collection.bulkWrite( [ { insertOne : { "document" : <document> } } ] )
updateOne y updateMany
updateOne actualiza un único documento en la colección que coincide con el filtro. Si coinciden varios documentos, updateOne actualizará únicamente el primer documento que coincida.
db.collection.bulkWrite( [ { updateOne : { "filter": <document>, "update": <document or pipeline>, "upsert": <boolean>, "collation": <document>, "arrayFilters": [ <filterdocument1>, ... ], "hint": <document|string> } } ] )
updateMany actualiza todos los documentos de la colección que coincidan con el filtro.
db.collection.bulkWrite( [ { updateMany : { "filter" : <document>, "update" : <document or pipeline>, "upsert" : <boolean>, "collation": <document>, "arrayFilters": [ <filterdocument1>, ... ], "hint": <document|string> } } ] )
Campo | notas |
|---|---|
| Los criterios de selección para actualizar. Los mismos selectores query que en el método |
| La operación de actualización que se debe realizar. Puede especificar cualquiera de los siguientes:
|
| Opcional. Un booleano para indicar si se debe realizar una inserción. Por defecto, |
| Opcional. Un arreglo de documentos de filtro que determinan qué elementos del arreglo modificar para una operación de actualización en un campo de arreglo. |
| Opcional. Especifica la intercalación que se debe utilizar para la operación. |
| Opcional. El índice que se utilizará para dar soporte a la actualización |
replaceOne
replaceOne reemplaza un único documento en la colección que coincide con el filtro. Si coinciden varios documentos, replaceOne reemplazará únicamente el primer documento coincidente.
db.collection.bulkWrite([ { replaceOne : { "filter" : <document>, "replacement" : <document>, "upsert" : <boolean>, "collation": <document>, "hint": <document|string> } } ] )
Campo | notas |
|---|---|
| Los criterios de selección para la operación de reemplazo. Los mismos selectores de query que en el método |
| El documento de reemplazo. El documento no puede contener operadores de actualización. |
| Opcional. Un booleano para indicar si se debe realizar una inserción. Por defecto, |
| Opcional. Especifica la intercalación que se debe utilizar para la operación. |
| Opcional. El índice que se utilizará para dar soporte a la actualización |
deleteOne y deleteMany
deleteOne borra un único documento de la colección que coincida con el filtro. Si varios documentos coinciden, deleteOne borrará solo el primer documento que coincida.
db.collection.bulkWrite([ { deleteOne : { "filter" : <document>, "collation" : <document> // Available starting in 3.4 } } ] )
deleteMany borra todos los documentos de la colección que coincidan con el filtro.
db.collection.bulkWrite([ { deleteMany: { "filter" : <document>, "collation" : <document> // Available starting in 3.4 } } ] )
Campo | notas |
|---|---|
| Los criterios de selección para la operación de eliminación. Los mismos selectores de query que en el método |
| Opcional. Especifica la intercalación que se debe utilizar para la operación. |
_id Campo
Si el documento no especifica un campo _id, entonces mongod agrega el campo _id y asigna un único ObjectId() al documento antes de insertarlo o actualizarlo. La mayoría de los controladores crean un ObjectId e insertan el campo _id, pero el mongod creará y completará el _id si el controlador o la aplicación no lo hace.
Si el documento contiene un campo _id, el valor de _id debe ser único dentro de la colección para evitar un error de clave duplicada.
Las operaciones de actualización o reemplazo no pueden especificar un valor _id que sea diferente del documento original.
Ejecución de operaciones
El parámetro ordered controla si las operaciones se ejecutan en serie o en cualquier orden.
Con ordered : true (valor predeterminado), las operaciones se ejecutan en serie. Si se produce un error, las operaciones posteriores no se ejecutan.
Con ordered : false, las operaciones pueden ejecutarse en paralelo. Todas las operaciones sin errores se completan, incluso si algunas fallan.
No hay límite para la cantidad de operaciones de escritura que un controlador puede gestionar. Los controladores agrupan los datos en lotes según el valor maxWriteBatchSize, que 100 es,000 y no se puede modificar. Si el lote contiene más 100 de,000 operaciones, el controlador lo divide en grupos más pequeños con recuentos menores o iguales al valor maxWriteBatchSize. Por ejemplo, si la operación 250 contiene,000 operaciones, el controlador crea tres lotes: dos 100 con,000 operaciones y uno con,50 000 operaciones.
Nota
El controlador solo divide el grupo en grupos más pequeños cuando utiliza el API de alto nivel. Si utilizas db.runCommand() directamente (por ejemplo, al escribir un controlador), MongoDB genera un error al intentar ejecutar un lote de escritura que excede el límite.
Si el informe de errores de un lote individual crece demasiado, MongoDB trunca todos los mensajes de error restantes a la cadena vacía. Si hay al menos dos mensajes de error con un tamaño total superior a 1MB, se truncan.
Los tamaños y la mecánica de agrupación son detalles internos de rendimiento y están sujetos a cambios en versiones futuras.
La ejecución de una ordered lista de operaciones en una colección particionada generalmente será más lenta que la ejecución de una lista unordered, ya que con una lista ordenada, cada operación debe esperar a que la anterior termine.
Colecciones con tamaño fijo
bulkWrite() tiene restricciones sobre las colecciones limitadas:
updateOneyupdateManylanza unWriteErrorsi la actualización aumenta el tamaño del documento.replaceOnelanza unWriteErrorsi el documento de reemplazo es más grande que el original.deleteOneydeleteManyarroja unWriteErroren colecciones limitadas.
Error Handling
bulkWrite() Lanza una BulkWriteError excepción en caso de errores. Consulte Manejo de errores dentro de las transacciones.
Excluyendo los errores de nivel de confirmación de escritura, las operaciones ordenadas se detienen después de un error, mientras que las operaciones no ordenadas continúan procesando las operaciones de escritura restantes en la cola, a menos que se ejecuten dentro de una transacción. Vea Manejo de errores dentro de las transacciones.
Los errores de nivel de confirmación de escritura se muestran en el campo writeConcernErrors, mientras que todos los demás errores se muestran en el campo writeErrors. Si se encuentra un error, se muestra el número de operaciones de escritura exitosas en lugar de los valores _id insertados. Las operaciones ordenadas muestran el único error encontrado, mientras que las operaciones desordenadas muestran cada error en un arreglo.
Errores de validación de esquema
Si la colección usa la validación de esquema y tiene validationAction configurado en error, se debe insertar un documento no válido o actualizar un documento con valores no válidos generará un error. Las operaciones anteriores a la operación no válida en el arreglo operations se ejecutan y se escriben en la colección. El campo ordered determina si se ejecutan las operaciones restantes.
Transacciones
bulkWrite() se puede utilizar dentro de transacciones distribuidas.
Importante
En la mayoría de los casos, una transacción distribuida incurre en un costo de rendimiento mayor que las escrituras de documentos individuales, y la disponibilidad de transacciones distribuidas no debería ser un sustituto para un diseño de esquema efectivo. Para muchos casos, el modelo de datos desnormalizado (documento incrustado y matrices) seguirá siendo óptimo para tus datos y casos de uso. Es decir, en muchos casos, modelar tus datos de forma adecuada minimizará la necesidad de transacciones distribuidas.
Para consideraciones adicionales sobre el uso de transacciones (como el límite de tiempo de ejecución y el límite de tamaño del oplog), consulta también las consideraciones de producción.
Inserciones y actualizaciones dentro de transacciones
Para la compatibilidad de características entre versiones (fcv) "4.4" y superiores, si se ejecuta una operación de inserción o una operación de actualización con upsert: true en una transacción contra una colección inexistente, la colección se crea implícitamente.
Nota
No puedes crear nuevas colecciones en transacciones de escritura entre particiones. Por ejemplo, si guardas en una colección existente en una partición y creas implícitamente una colección en una partición diferente, MongoDB no puede realizar ambas operaciones en la misma transacción.
Nivel de confirmación de escritura y transacciones
No establezcas explícitamente el nivel de confirmación de escritura para la operación si se ejecuta en una transacción. Para usar el nivel de confirmación de escritura con transacciones, consulta Transacciones y nivel de confirmación de escritura.
Manejo de errores dentro de las transacciones
A partir de MongoDB 4.2, si una operación db.collection.bulkWrite() encuentra un error dentro de una transacción, el método lanza una BulkWriteException (igual que fuera de una transacción).
En la versión 4.0, si la operación bulkWrite encuentra un error dentro de una transacción, el error generado no se envuelve como un BulkWriteException.
Dentro de una transacción, el primer error en un guardado masivo provoca que todo el guardado masivo falle y aborte la transacción, incluso si el guardado masivo no está ordenado.
Ejemplos
Los ejemplos de esta página utilizan datos del conjunto de datos de ejemplo sample_mflix. Para obtener más información sobre cómo cargar este conjunto de datos en su implementación de MongoDB autogestionada, consulte Cargar el conjunto de datos de ejemplo. Si realizó alguna modificación en las bases de datos de ejemplo, es posible que deba eliminarlas y volver a crearlas para ejecutar los ejemplos de esta página.
Ejemplo de guardado masivo no ordenado
Para especificar un bulkWrite() no ordenado, establezca ordered en false.
En una lista desordenada bulkWrite() de operaciones:
Las operaciones pueden ejecutarse en paralelo (no está garantizado). Para obtener más detalles, consulte Operaciones ordenadas o no ordenadas.
Las operaciones con errores no se completan.
Se han completado todas las operaciones sin errores.
En el siguiente ejemplo:
bulkWrite()ejecuta operaciones no ordenadas en la colecciónusers.La segunda operación
insertOne, que está comentada, tiene el mismo_idque la primerainsertOne, lo que provoca un error de clave duplicada.
db.users.bulkWrite( [ { insertOne: { document: { _id: ObjectId("67a1b2c3d4e5f6a7b8c9d0e9"), name: "Sansa Stark", email: "sansa.stark@example.com", password: "$2b$12$UREFwsRUoyF0CRqGNK0LzO0HM/jLhgUCNNIJ9RJAqMUQ74crlJ1Vu" } } }, // This insert operation with the same _id value as the one above will fail // { insertOne: { // document: { // _id: ObjectId("67a1b2c3d4e5f6a7b8c9d0e9"), // Duplicate _id value // name: "Bran Stark", // email: "bran.stark@example.com", // password: "$2b$12$UREFwsRUoyF0CRqGNK0LzO0HM/jLhgUCNNIJ9RJAqMUQ74crlJ1Vu" // } // } }, { updateOne: { filter: { name: "Catelyn Stark" }, update: { $set: { email: "cat.stark@example.com" } } } }, { deleteOne: { filter: { name: "Ned Stark" } } }, { replaceOne: { filter: { name: "Robb Stark" }, replacement: { name: "Robb Stark", email: "robb.stark@example.com", password: "$2b$12$NewPasswordHashHere123456789012345678901234567890" } } } ], { ordered: false } )
La segunda operación insertOne falla debido al error de clave duplicada. En un bulkWrite() desordenado, MongoDB completa cualquier operación sin errores.
Errores de nivel de confirmación de escritura (write concern) en clústeres particionados
Cambiado en la versión 8.1.2.
Cuando bulkWrite() se ejecuta en en un clúster mongos fragmentado,writeConcernError siempre se informa un en la respuesta, incluso si se producen uno o más errores. En versiones anteriores, otros errores a veces provocaban bulkWrite() que no informara errores de escritura.
Por ejemplo, si un documento no supera la validación, activando un error DocumentValidationFailed, y también ocurre un error de nivel de confirmación de escritura, tanto el error DocumentValidationFailed como el writeConcernError se devuelven en el campo de nivel superior de la respuesta.
Ejemplo de guardado masivo con nivel de confirmación de escritura
El siguiente ejemplo bulkWrite() ejecuta operaciones en la colección users y establece un nivel de confirmación de escritura "majority" con un tiempo de espera de 100 milisegundos:
db.users.bulkWrite( [ { updateMany: { filter: { name: { $regex: /Stark$/ } }, update: { $set: { house: "Stark", verified: false } } } }, { updateOne: { filter: { name: "Ned Stark" }, update: { $set: { title: "Lord of Winterfell" } } } }, { updateOne: { filter: { name: "Catelyn Stark" }, update: { $set: { title: "Lady of Winterfell" } } } } ], { writeConcern: { w: "majority", wtimeout: 100 } } )
Si el tiempo que tarda la mayoría de los miembros del conjunto de réplicas en reconocer las operaciones supera wtimeout, el ejemplo devuelve un error de escritura y un resumen de las operaciones completadas.