Atualizar vários documentos
Você pode atualizar diversos documentos usando o método updateMany()
em um objeto MongoCollection
. O método aceita um filtro que corresponde ao documento que você deseja atualizar e uma declaração de atualização que instrui o driver como alterar o documento correspondente. O método updateMany()
atualiza todos os documentos na collection que correspondem ao filtro.
Para realizar uma atualização com o método updateMany()
, você deve utilizar um filtro de query e um documento de atualização. O filtro de query especifica quais documentos da collection devem ser correspondidos, e o documento de atualização fornece instruções sobre quais alterações devem ser feitas neles.
Opcionalmente, você pode passar uma instância de UpdateOptions
para o método updateMany()
para modificar o comportamento da chamada. Por exemplo, se você definir o campo upsert
do objeto UpdateOptions
como true
e nenhum documento corresponder ao filtro de query especificado, a operação insere um novo documento composto pelos campos do documento de query e de atualização.
Após a execução bem-sucedida, o método updateMany()
gera uma instância de UpdateResult
. Você pode recuperar informações, como o número de documentos modificados, chamando o método getModifiedCount()
. Se você especificou upsert(true)
em um objeto UpdateOptions
e a operação resultar em uma inserção, você poderá recuperar o campo _id
do novo documento chamando o método getUpsertedId()
na instância UpdateResult
.
Se sua operação de atualização falhar, o driver gerará uma exceção e não atualizará nenhum dos documentos correspondentes ao filtro. Por exemplo, se você tentar definir um valor para o campo imutável _id
em seu documento de atualização, o método updateMany()
não atualizará nenhum documento e lançará um MongoWriteException
com a mensagem:
Performing an update on the path '_id' would modify the immutable field '_id'
Se o documento de atualização contiver uma alteração que viole as regras de índice único, o método lançará um MongoWriteException
com uma mensagem de erro que deve ser semelhante a esta:
E11000 duplicate key error collection: ...
Para obter mais informações sobre os tipos de exceções geradas em condições específicas, consulte a documentação da API para updateMany()
, cujo link está no final desta página.
Exemplo
Neste exemplo, usamos um construtor Filter
para filtrar nossa query para filmes no gênero "Discutido com frequência".
Em seguida, atualizamos documento que correspondem a nossa query na collection movies
do reconhecimento de data center sample_mflix
. Realizamos as seguintes atualizações nos documentos correspondentes:
Adicione
Frequently Discussed
à array degenres
somente se ela ainda não existirDefina o valor de
lastUpdated
para o horário atual.
Usamos o construtor Updates
, uma classe de fábrica que contém métodos de assistente estática para construir o documento de atualização. Embora você possa passar um documento de atualização em vez de usar o construtor, o construtor oferece verificação de tipo e sintaxe simplificada. Leia nossoguia sobre atualizações na seção Construtores para obter mais informações.
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 o Guia de conexão.
import com.mongodb.MongoException import com.mongodb.client.model.Filters import com.mongodb.client.model.Updates import com.mongodb.kotlin.client.coroutine.MongoClient import kotlinx.coroutines.runBlocking import java.time.LocalDateTime data class Movie( val num_mflix_comments: Int, val genres: List<String>, val lastUpdated: LocalDateTime ) 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") val query = Filters.gt(Movie::num_mflix_comments.name, 50) val updates = Updates.combine( Updates.addToSet(Movie::genres.name, "Frequently Discussed"), Updates.currentDate(Movie::lastUpdated.name) ) try { val result = collection.updateMany(query, updates) println("Modified document count: " + result.modifiedCount) } catch (e: MongoException) { System.err.println("Unable to update due to an error: $e") } mongoClient.close() }
Modified document count: 53
Depois de executar o exemplo, você deverá ver uma saída semelhante.
Se você consultar o documento ou documentos atualizado(s), ele(s) deverá(ão) se parecer com o seguinte:
Movie(num_mflix_comments=100, genres=[ ... Frequently Discussed], lastUpdated= ... )
Para obter mais informações sobre as classes e métodos mencionados nesta página, consulte a seguinte documentação da API: