Docs Menu
Docs Home
/ /
/ / /

Operaciones de escritura masiva

En esta guía, puede aprender cómo realizar múltiples operaciones de escritura en una sola llamada de base de datos mediante operaciones de escritura masiva.

Considere un escenario en el que desea insertar un documento en una colección, actualizar varios documentos y luego eliminar un documento. Si utiliza métodos individuales, cada operación requiere su propia llamada a la base de datos. Esta guía le muestra cómo usar operaciones de escritura masiva para reducir el número de llamadas a la base de datos.

Los ejemplos de esta guía utilizan el sample_restaurants.restaurants colección de la Conjuntos de datos de muestra de Atlas. Para aprender a crear un clúster gratuito de MongoDB Atlas y cargar los conjuntos de datos de muestra, consulte Tutorial de introducción.

Importante

Proyecto Reactor librería

Esta guía utiliza la biblioteca Project Reactor para consumir Publisher las instancias devueltas por los métodos del controlador Java Reactive Streams. Para obtener más información sobre la biblioteca Project Reactor y cómo usarla, consulte la sección "Introducción" en la documentación de Reactor. Para obtener más información sobre cómo usamos los métodos de la biblioteca Project Reactor en esta guía, consulte la guía "Escribir datos en MongoDB".

Para cada operación de escritura que desee realizar, cree una instancia de una de las siguientes clases:

  • InsertOneModel

  • UpdateOneModel

  • UpdateManyModel

  • ReplaceOneModel

  • DeleteOneModel

  • DeleteManyModel

Luego, pase una lista de estas instancias al método bulkWrite().

Las siguientes secciones muestran cómo crear y utilizar instancias de las clases anteriores.

Para realizar una operación de inserción, cree una instancia de InsertOneModel y pase el documento que desea insertar.

El siguiente ejemplo crea una instancia de InsertOneModel:

InsertOneModel<Document> operation = new InsertOneModel<>(
new Document("name", "Mongo's Deli")
.append("cuisine", "Sandwiches"));

Para insertar varios documentos, cree una instancia de InsertOneModel para cada documento.

Para actualizar un documento, cree una instancia de UpdateOneModel y pase los siguientes argumentos:

  • Filtro de consulta que especifica los criterios utilizados para buscar coincidencias en los documentos de su colección.

  • Operación de actualización que desea realizar. Para más información sobre las operaciones de actualización, consulte la guía "Operadores de actualización de campos" en el manual de MongoDB Server.

UpdateOneModel actualiza el primer documento que coincide con su filtro de consulta.

El siguiente ejemplo crea una instancia de UpdateOneModel:

UpdateOneModel<Document> operation = new UpdateOneModel<>(
eq("name", "Mongo's Deli"),
set("cuisine", "Sandwiches and Salads"));

Para actualizar varios documentos, cree una instancia de UpdateManyModel y pase los mismos argumentos. UpdateManyModel actualiza todos los documentos que coinciden con su filtro de consulta.

El siguiente ejemplo crea una instancia de UpdateManyModel:

UpdateManyModel<Document> operation = new UpdateManyModel<>(
eq("name", "Mongo's Deli"),
set("cuisine", "Sandwiches and Salads"));

Una operación de reemplazo elimina todos los campos y valores de un documento específico, excepto el campo _id, y los reemplaza por otros nuevos. Para realizar una operación de reemplazo, cree una instancia de ReplaceOneModel y pase un filtro de consulta, así como los campos y valores que desea almacenar en el documento correspondiente.

El siguiente ejemplo crea una instancia de ReplaceOneModel:

ReplaceOneModel<Document> operation = new ReplaceOneModel<>(
eq("name", "Original Pizza"),
new Document("name", "Mongo's Pizza")
.append("borough", "Manhattan"));

Para reemplazar varios documentos, cree una instancia de ReplaceOneModel para cada documento.

Para eliminar un documento, cree una instancia de DeleteOneModel y pase un filtro de consulta que especifique el documento que desea eliminar. DeleteOneModel elimina solo el primer documento que coincide con su filtro de consulta.

El siguiente ejemplo crea una instancia de DeleteOneModel:

DeleteOneModel<Document> operation = new DeleteOneModel<>(
eq("restaurant_id", "5678"));

Para eliminar varios documentos, cree una instancia de DeleteManyModel y pase un filtro de consulta que especifique los documentos que desea eliminar. DeleteManyModel elimina todos los documentos que coinciden con su filtro de consulta.

El siguiente ejemplo crea una instancia de DeleteManyModel:

DeleteManyModel<Document> operation = new DeleteManyModel<>(
eq("name", "Mongo's Deli"));

Después de definir una instancia de clase para cada operación que desee realizar, pase una lista de estas instancias al método bulkWrite(). De forma predeterminada, el método ejecuta las operaciones en el orden en que están definidas en la lista.

El siguiente ejemplo realiza múltiples operaciones de escritura utilizando el método bulkWrite():

Publisher<BulkWriteResult> bulkWritePublisher = restaurants.bulkWrite(
Arrays.asList(new InsertOneModel<>(
new Document("name", "Mongo's Deli")
.append("cuisine", "Sandwiches")
.append("borough", "Manhattan")
.append("restaurant_id", "1234")),
new InsertOneModel<>(new Document("name", "Mongo's Deli")
.append("cuisine", "Sandwiches")
.append("borough", "Brooklyn")
.append("restaurant_id", "5678")),
new UpdateManyModel<>(eq("name", "Mongo's Deli"),
set("cuisine", "Sandwiches and Salads")),
new DeleteOneModel<>(eq("restaurant_id", "1234"))));
BulkWriteResult bulkResult = Mono.from(bulkWritePublisher).block();
System.out.println(bulkResult.toString());
AcknowledgedBulkWriteResult{insertedCount=2, matchedCount=2, removedCount=1, modifiedCount=2, upserts=[], inserts=[BulkWriteInsert{index=0, id=BsonObjectId{value=66a7e0a6c08025218b657208}}, BulkWriteInsert{index=1, id=BsonObjectId{value=66a7e0a6c08025218b657209}}]}

Si falla alguna de las operaciones de escritura, el controlador Java Reactive Streams señala MongoBulkWriteException y no realiza ninguna otra operación individual. MongoBulkWriteException incluye un BulkWriteError al que se puede acceder mediante el método MongoBulkWriteException.getWriteErrors(), que proporciona detalles de la falla individual.

Nota

Cuando el controlador de Java Reactive Streams ejecuta una operación masiva, utiliza el writeConcern de la colección donde se ejecuta la operación. El controlador informa todos los errores de escritura después de intentar todas las operaciones, independientemente del orden de ejecución.

La clase BulkWriteOptions contiene métodos que modifican el comportamiento del método bulkWrite(). Para usar la clase BulkWriteOptions, construya una nueva instancia de la clase y luego invoque uno o más de sus métodos para modificar la operación de escritura. Puede encadenar estas llamadas a métodos. Para modificar el comportamiento de la operación de escritura, pase la instancia de la clase como último argumento del método bulkWrite().

Puede usar los siguientes métodos en la clase BulkWriteOptions para modificar un método de escritura. Todos los métodos son opcionales.

Método
Descripción

bypassDocumentValidation(Boolean bypassDocumentValidation)

Specifies whether the bulk write operation bypasses document validation. This lets you perform write operations on documents that don't meet the schema validation requirements, if any exist. For more information about schema validation, see Schema Validation in the MongoDB Server manual.

comment(Bson comment)

Attaches a Bson comment to the operation. For more information, see the insert command fields guide in the MongoDB Server manual.

comment(String comment)

Attaches a String comment to the operation. For more information, see the insert command fields guide in the MongoDB Server manual.

let(Bson variables)

Specifies a map of parameter names and values. Values must be constant or closed expressions that don't reference document fields. For more information, see the let statement in the MongoDB Server manual.

ordered(Boolean ordered)

If set to True, the driver performs the individual operations in the order provided. If an individual operation fails, the driver will not execute any subsequent individual operations.
Defaults to True.

El siguiente ejemplo llama al método bulkWrite() del ejemplo anterior pero establece la opción ordered en False:

Publisher<BulkWriteResult> bulkWritePublisher = restaurants.bulkWrite(
Arrays.asList(new InsertOneModel<>(
new Document("name", "Mongo's Deli")
.append("cuisine", "Sandwiches")
.append("borough", "Manhattan")
.append("restaurant_id", "1234")),
new InsertOneModel<>(new Document("name", "Mongo's Deli")
.append("cuisine", "Sandwiches")
.append("borough", "Brooklyn")
.append("restaurant_id", "5678")),
new UpdateManyModel<>(eq("name", "Mongo's Deli"),
set("cuisine", "Sandwiches and Salads")),
new DeleteOneModel<>(eq("restaurant_id", "1234"))),
new BulkWriteOptions().ordered(false));
BulkWriteResult bulkResult = Mono.from(bulkWritePublisher).block();
System.out.println(bulkResult.toString());
AcknowledgedBulkWriteResult{insertedCount=2, matchedCount=2, removedCount=1, modifiedCount=2, upserts=[], inserts=[BulkWriteInsert{index=0, id=BsonObjectId{value=66a7e03cce430c5854b6caf9}}, BulkWriteInsert{index=1, id=BsonObjectId{value=66a7e03cce430c5854b6cafa}}]}

Si alguna de las operaciones de escritura en una escritura masiva desordenada falla, el driver de Java Reactive Streams informa los errores solo después de intentar todas las operaciones.

Nota

Las operaciones masivas desordenadas no garantizan el orden de ejecución. El orden puede variar según la forma en que se enumeran para optimizar el tiempo de ejecución.

Para aprender a realizar operaciones de escritura individuales, consulte las siguientes guías:

Para aprender más sobre cualquiera de los métodos o tipos analizados en esta guía, consulta la siguiente documentación de API:

Volver

Borrar

En esta página