Visão geral
Neste guia, você pode aprender como atualizar documentos em uma coleção MongoDB utilizando os métodos updateOne() e updateMany().
Dados de amostra
Os exemplos deste guia executam operações na collection paint_inventory, que armazena documentos que representam cores de tinta no inventário de uma loja. Esta collection contém os seguintes documentos de exemplo:
{ "_id": 1, "color": "red", "qty": 5, "prices": [15.99, 19.99] } { "_id": 2, "color": "purple", "qty": 8, "prices": [18.99, 22.99] } { "_id": 3, "color": "yellow", "qty": 0, "prices": [14.99, 17.99] } { "_id": 4, "color": "green", "qty": 6, "prices": [19.99, 24.99] } { "_id": 5, "color": "blue", "qty": 3, "prices": [17.99, 21.99] }
A seguinte classe de dados Kotlin modela os documentos da coleção:
data class PaintOrder( val id: Int, val color: String, val qty: Int, val prices: List<Double> )
Executar uma operação de atualização
Você pode atualizar documentos no MongoDB com os seguintes métodos:
updateOne(), que atualiza o primeiro documento que corresponde aos critérios de pesquisaupdateMany(), que atualiza todos os documentos que correspondem aos critérios de pesquisa
Cada método de atualização exige os seguintes parâmetros:
Filtro de consulta, que corresponde a quais documentos atualizar. Para saber mais sobre filtros de query, consulte o guia Especificar uma query .
documento de atualização , que especifica o operador de atualização ou o tipo de atualização a ser executada e os campos e valores a serem atualizados. Para obter uma lista de operadores de atualização e seus usos, consulte os operadores de atualização decampo do no manual do servidor MongoDB .
Os exemplos neste guia usam o Updates construtor, uma classe de fábrica que fornece métodos de assistente para construir documentos de atualização. Para saber mais sobre o Updates construtor, consulte o guia Atualizações de construtores.
Atualizar um documento
Este exemplo utiliza o método updateOne() para executar a seguinte ação:
Corresponde a um documento no qual o valor do campo
coloré"yellow"Usa o construtor
Updatespara incrementar o valor de campoqtydo documento correspondente em1
val filter = Filters.eq(PaintOrder::color.name, "yellow") val update = Updates.inc(PaintOrder::qty.name, 1) val result = collection.updateOne(filter, update) println("Matched document count: ${result.matchedCount}") println("Modified document count: ${result.modifiedCount}")
Matched document count: 1 Modified document count: 1
Observação
Se vários documentos corresponderem ao filtro de query passado para o updateOne() método, a operação atualizará somente o primeiro resultado. Para controlar a qual documento a operação corresponde, você pode especificar uma ordem de classificação. Para saber mais sobre a sort opção, consulte a página Classificar resultados.
Atualizar muitos documentos
O exemplo a seguir usa o método updateMany() para executar as ações a seguir:
Corresponde a todos os documentos usando um filtro de query vazio
Usa o construtor
Updatespara aumentar o valor do campoqtyem20em todos os documentos correspondentes
val filterMany = Filters.empty() val updateMany = Updates.inc(PaintOrder::qty.name, 20) val resultMany = collection.updateMany(filterMany, updateMany) println("Matched document count: ${resultMany.matchedCount}") println("Modified document count: ${resultMany.modifiedCount}")
Matched document count: 5 Modified document count: 5
Após a operação de atualização, os documentos na coleção paint_inventory têm os seguintes valores:
{ "_id": 1, "color": "red", "qty": 25, "prices": [15.99, 19.99] } { "_id": 2, "color": "purple", "qty": 28, "prices": [18.99, 22.99] } { "_id": 3, "color": "yellow", "qty": 20, "prices": [14.99, 17.99] } { "_id": 4, "color": "green", "qty": 26, "prices": [19.99, 24.99] } { "_id": 5, "color": "blue", "qty": 23, "prices": [17.99, 21.99] }
Observação
Se o filtro de query não corresponder a nenhum documento, o updateMany() método não fará alterações nos documentos da coleção. Você pode usar a upsert opção para inserir um novo documento se nenhum corresponder. Para visualizar um exemplo que usa esta opção, consulte Inserir ou atualizar em uma única operação.
Importante
Os updateOne() updateMany() métodos e não podem fazer alterações em um documento que viole restrições de índice único na collection. Para saber mais, consulte Índices únicos no manual do servidor MongoDB .
Atualizar elementos de array
Para atualizar os valores de array de um documento, use o construtor Updates para especificar a atualização que deseja executar e os elementos de array a serem atualizados. Em seguida, chame o método updateOne() ou updateMany() para executar a operação de atualização.
Você pode especificar quais elementos da array atualizar usando os seguintes operadores posicionais:
$: Atualiza o primeiro elemento de array que corresponde ao filtro de query.$[]: Atualiza todos os elementos em uma array.$[<identifier>]: atualiza os elementos de array que correspondem a um filtro.
Os exemplos nesta seção mostram como usar cada operador posicional.
Atualizar primeiro elemento correspondente
Para atualizar o primeiro elemento de array que corresponde ao filtro de query, use o operador posicional ($) e especifique o campo de array a ser atualizado no filtro de query.
Este exemplo executa as seguintes ações:
Corresponde a um documento com uma array
pricescontendo o valor15.99Usa o operador posicional
$para aumentar o primeiro valor na arraypricesdo documento correspondente em2
val filterArrayFirst = Filters.eq(PaintOrder::prices.name, 15.99) val updateArrayFirst = Updates.inc("${PaintOrder::prices.name}.$", 2) val resultArrayFirst = collection.updateOne(filterArrayFirst, updateArrayFirst) println("Modified document count: ${resultArrayFirst.modifiedCount}")
Modified document count: 1
Atualizar todos os elementos
Para atualizar todos os elementos em uma array, use o operador posicional all ($[]).
Este exemplo executa as seguintes ações:
Corresponde a um documento com um valor
colorde"green"Usa o operador posicional
$[]para multiplicar todos os valores na arraypricesdo documento correspondente por1.1