Realizar operações em massa
O método bulkWrite()
executa operações de gravação em lote em uma collection. Esse método reduz o número de viagens de ida e volta da rede do seu aplicativo para a instância do MongoDB, o que aumenta o desempenho do seu aplicativo. Como você só recebe o status de sucesso depois que todas as operações retornam, recomendamos usar isso se for atender aos requisitos do seu caso de uso.
Você pode especificar uma ou mais das seguintes operações de gravação no bulkWrite()
:
insertOne
updateOne
updateMany
deleteOne
deleteMany
replaceOne
O método bulkWrite()
aceita os seguintes parâmetros:
Um
List
de objetos que implementam oWriteModel
: as classes que implementam oWriteModel
correspondem às operações de gravação mencionadas acima. Por exemplo, a classeInsertOneModel
envolve a operação de gravaçãoinsertOne
. Consulte os links para a documentação da API na parte inferior desta página para obter mais informações sobre cada classe.BulkWriteOptions
: objeto opcional que especifica configurações, por exemplo, como garantir que a instância do MongoDB ordene suas operações de gravação.
Observação
Gravações repetíveis são executadas nas versões 3.6 ou posteriores do Servidor MongoDB em operações de gravação em massa, a menos que incluam uma ou mais instâncias de UpdateManyModel
ou DeleteManyModel
.
Dica
Por padrão, o MongoDB executa operações de gravação em massa, uma a uma, na ordem especificada (por exemplo, em série). Durante uma gravação em massa ordenada, se ocorrer um erro durante o processamento de uma operação, o MongoDB retornará sem processar as operações restantes na lista. Por outro lado, quando você define ordered
como false
, o MongoDB continua processando as operações de gravação restantes na lista no caso de um erro. As operações não ordenadas são teoricamente mais rápidas, já que o MongoDB pode executá-las em paralelo, mas só devem ser usadas se as gravações não dependerem da ordem.
O método bulkWrite()
gera um objeto BulkWriteResult
que contém informações sobre os resultados da operação de gravação, incluindo o número de documentos inseridos, modificados e excluídos.
Se uma ou mais de suas operações tentarem definir um valor que viole um índice único em sua collection, uma exceção será gerada da seguinte forma:
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: ... }].
Da mesma forma, se você tentar executar uma gravação em massa em uma coleção que usa validação de esquema e uma ou mais de suas operações de escrita fornecer um formato inesperado, você pode encontrar exceções.
Exemplo
A amostra de código a seguir executa uma operação de gravação ordenada em massa na collection movies
do banco de dados sample_mflix
. A chamada de exemplo para bulkWrite()
inclui exemplos de InsertOneModel
, UpdateOneModel
e DeleteOneModel
.
Observação
Esse exemplo se conecta a uma instância do MongoDB usando um URI de conexão. Para saber mais sobre como se conectar à sua instância do MongoDB , consulte oguia de conexão .
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 obter informações adicionais sobre as classes e métodos mencionados nesta página, consulte os seguintes recursos:
Entrada manual do servidor Índice único
Validação de esquema Entrada manual do servidor
Documentação da API do bulkWrite()
BulkWriteOptions Documentação da API
BulkWriteResult Documentação da API
InsertOneModel Documentação da API
Documentação da API do UpdateOneModel
Documentação da API do UpdateManyModel
Documentação da API do DeleteOneModel
Documentação da API do DeleteManyModel
Documentação da API do ReplaceOneModel