Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home

Realizar operaciones en masa

La bulkWrite() El método realiza operaciones de escritura por lotes en una única colección. Este método reduce el número de viajes de ida y vuelta de la red desde tu aplicación a tu instancia de MongoDB, lo que aumenta el rendimiento de tu aplicación. Puesto que solo recibes el estado de éxito después de que todas las operaciones regresan, te recomendamos usar esto si cumple con los requisitos de tu caso de uso.

Puedes especificar una o más de las siguientes operaciones de guardado en bulkWrite():

  • insertOne

  • updateOne

  • updateMany

  • deleteOne

  • deleteMany

  • replaceOne

El método bulkWrite() acepta los siguientes parámetros:

  • Un List de objetos que implementan WriteModel: las clases que implementan WriteModel corresponden a las operaciones de escritura antes mencionadas. Por ejemplo, la clase InsertOneModel encierra la operación de guardar insertOne. Consulta los enlaces a la documentación de la API al final de esta página para obtener más información sobre cada clase.

  • BulkWriteOptions: opcional objeto que especifica configuraciones, como si se debe asegurar que tu instancia de MongoDB ordene tus operaciones de escritura.

Nota

Las escrituras reintentables se ejecutan en operaciones de escritura masiva, a menos que incluyan una o más instancias de UpdateManyModel o DeleteManyModel.

Tip

Por defecto, MongoDB ejecuta las operaciones de escritura por lotes una por una en el orden especificado (es decir, de forma serial). Durante un guardado masivo ordenado, si ocurre un error durante el procesamiento de una operación, MongoDB devuelve sin procesar las operaciones restantes en la lista. Por el contrario, cuando se configura ordered en false, MongoDB continúa procesando las operaciones de escritura restantes en la lista en caso de error. Las operaciones no ordenadas son teóricamente más rápidas ya que MongoDB puede ejecutarlas en paralelo, pero solo debes usarlas si tus guardados no dependen del orden.

El método bulkWrite() devuelve un objeto BulkWriteResult que contiene información sobre los resultados de la operación de escritura, incluyendo el número de documentos insertados, modificados y eliminados.

Si una o más de sus operaciones intenta establecer un valor que infrinja un índice único en su colección, se genera una excepción que debería verse algo así:

The bulk write operation failed due to an error: Bulk write operation error on server <hostname>. Write errors: [BulkWriteError{index=0, code=11000, message='E11000 duplicate key error collection: ... }].

De manera similar, si intenta realizar una escritura masiva en una colección que utiliza validación de esquema y una o más de sus operaciones de escritura proporcionan un formato inesperado, puede encontrar excepciones.

El siguiente código de muestra realiza una operación de escritura por lotes ordenada en la colección movies de la base de datos sample_mflix. La llamada de ejemplo a bulkWrite() incluye ejemplos del InsertOneModel, UpdateOneModel y DeleteOneModel.

Nota

Este ejemplo se conecta a una instancia de MongoDB utilizando un URI de conexión. Para obtener más información sobre cómo conectarse a tu instancia de MongoDB, consulta el guía de conexión.

import com.mongodb.MongoException
import com.mongodb.client.model.DeleteOneModel
import com.mongodb.client.model.Filters
import com.mongodb.client.model.InsertOneModel
import com.mongodb.client.model.ReplaceOneModel
import com.mongodb.client.model.UpdateOneModel
import com.mongodb.client.model.UpdateOptions
import com.mongodb.client.model.Updates
import com.mongodb.kotlin.client.coroutine.MongoClient
import kotlinx.coroutines.runBlocking
data class Movie(val title: String, val runtime: Int? = null)
fun main() = runBlocking {
// Replace the uri string with your MongoDB deployment's connection string
val uri = "<connection string uri>"
val mongoClient = MongoClient.create(uri)
val database = mongoClient.getDatabase("sample_mflix")
val collection = database.getCollection<Movie>("movies")
try {
val result = collection.bulkWrite(
listOf(
InsertOneModel(Movie("A Sample Movie")),
InsertOneModel(Movie("Another Sample Movie")),
InsertOneModel(Movie("Yet Another Sample Movie")),
UpdateOneModel(
Filters.eq(Movie::title.name,"A Sample Movie"),
Updates.set(Movie::title.name, "An Old Sample Movie"),
UpdateOptions().upsert(true)
),
DeleteOneModel(Filters.eq("title", "Another Sample Movie")),
ReplaceOneModel(
Filters.eq(Movie::title.name, "Yet Another Sample Movie"),
Movie("The Other Sample Movie", 42)
)
)
)
println(
"""
Result statistics:
inserted: ${result.insertedCount}
updated: ${result.modifiedCount}
deleted: ${result.deletedCount}
""".trimIndent()
)
} catch (e: MongoException) {
System.err.println("The bulk write operation failed due to an error: $e")
}
mongoClient.close()
}
Result statistics:
inserted: 3
updated: 2
deleted: 1

Para obtener información adicional sobre las clases y métodos mencionados en esta página, consulte los siguientes recursos:

  • Índice único Entrada de manual del servidor

  • Entrada manual del servidorde validación de esquemas

  • bulkWrite() Documentación de la API

  • BulkWriteOptions Documentación de la API

  • BulkWriteResult Documentación de la API

  • InsertOneModel Documentación de la API

  • UpdateOneModel API Documentation

  • Documentación de la APIUpdateManyModel

  • DeleteOneModel Documentación de la API

  • Documentación de la API deDeleteManyModel

  • ReplaceOneModel Documentación de la API