Modificar documentos
Nesta página
Visão geral
Neste guia, você pode aprender como modificar documentos em uma coleção MongoDB usando dois tipos de operação distintos:
As operações de atualização especificam os campos e valores a serem alterados em um ou mais documentos. Uma operação de substituição especifica o campo e valores para substituir um único documento da sua collection.
Nos exemplos a seguir, uma loja de tintas vende cinco cores diferentes de tinta. A collection paint_inventory
representa seu inventário atual:
{ "_id": 1, "color": "red", "qty": 5 } { "_id": 2, "color": "purple", "qty": 8 } { "_id": 3, "color": "yellow", "qty": 0 } { "_id": 4, "color": "green", "qty": 6 } { "_id": 5, "color": "pink", "qty": 0 }
Esses dados são modelados com a seguinte classe de dados Kotlin:
data class PaintOrder( val id: Int, val color: String, val qty: Int )
Update
As operações de atualização podem modificar campos e valores. Eles aplicam alterações especificadas em um documento de atualização a um ou mais documentos que correspondem ao seu filtro de query.
O método updateOne() altera o primeiro documento que seu filtro de query corresponde e o método updateMany() altera todos os documentos que seu filtro de query corresponde.
Você pode chamar os métodos updateOne()
e updateMany()
em uma instância MongoCollection
como segue:
collection.updateOne(<query>, <updateDocument>) collection.updateMany(<query>, <updateDocument>)
Atualizar parâmetros de operação
Os métodos updateOne()
e updateMany()
têm os seguintes parâmetros:
query
especifica um filtro de query com os critérios para corresponder aos documentos a serem atualizados em sua coleçãoupdateDocument
especifica os campos e valores a serem modificados no documento ou documentos correspondentes. Este exemplo utiliza os métodos do construtor de Atualizações do para criar o documento de atualização.(Opcional)
updateOptions
especifica opções que você pode definir para personalizar como o driver executa a operação de atualização. Para saber mais sobre esse tipo, consulte a documentação da API para UpdateOptions.
Você pode criar o updateDocument
utilizando um construtor Updates
como segue:
val updateDocument = Updates.operator(<field>, <value>)
Para ver uma lista completa de Updates
construtores e seu uso, consulte Atualizações na documentação da API.
Atualizar um exemplo
A loja de tintas precisa atualizar seu estoque após um cliente devolver uma lata de tinta amarela.
Para atualizar a única lata de tinta, chame o método updateOne()
especificando o seguinte:
Filtro de query que corresponde à cor amarela
Atualizar documento que contém instruções para incrementar o campo
qty
até1
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
Se vários documentos corresponderem ao filtro de query especificado no método updateOne()
, ele atualizará o primeiro resultado. Você pode especificar uma classificação em uma instância do UpdateOptions
para aplicar um pedido aos documentos correspondentes antes que o driver execute a operação de atualização, conforme mostrado no código a seguir:
val opts = UpdateOptions().sort(Sorts.ascending(PaintOrder::color.name))
Atualizar muitos exemplos
O armazém de tintas então recebe uma nova remessa e precisa atualizar seu estoque novamente. A remessa contém 20 latas de cada cor de tinta.
Para atualizar o inventário, chame o método updateMany()
especificando o seguinte:
Filtro de query que corresponde a todas as cores
Atualizar documento que contém instruções para incrementar o campo
qty
até20
val filter = Filters.empty() val update = Updates.inc(PaintOrder::qty.name, 20) val result = collection.updateMany(filter, update) println("Matched document count: $result.matchedCount") println("Modified document count: $result.modifiedCount")
Matched document count: 5 Modified document count: 5
O seguinte mostra os documentos atualizados na coleção paint_inventory
:
{ "_id": 1, "color": "red", "qty": 25 } { "_id": 2, "color": "purple", "qty": 28 } { "_id": 3, "color": "yellow", "qty": 20 } { "_id": 4, "color": "green", "qty": 26 } { "_id": 5, "color": "pink", "qty": 20 }
Se zero documentos corresponderem ao filtro de query na operação de atualização, updateMany()
não fará alterações nos documentos na coleção.Consulte o guia Upsert para saber como inserir um novo documento em vez de atualizar um se nenhum documento corresponder.
Importante
Os métodos updateOne()
e updateMany()
não podem fazer alterações em um documento que viole restrições de índice único na coleção. Consulte o manual do servidor MongoDB para obter mais informações sobre índices únicos.
Substituir
Uma operação de substituição substitui um documento da sua collection. A substituição ocorre entre um documento ao qual seu filtro de query corresponde e um documento de substituição.
O replaceOne() método remove todos os campos e valores existentes no documento correspondente (exceto o _id
campo ) e o substitui pelo documento de substituição.
Você pode chamar o método replaceOne()
em uma instância MongoCollection
da seguinte forma:
collection.replaceOne(<query>, <replacementDocument>)
Substituir parâmetros de operação
O método replaceOne()
tem os seguintes parâmetros:
query
especifica um filtro de consulta com os critérios para corresponder a um documento para substituir em sua coleçãoreplacementDocument
especifica campos e valores de um novo objetoDocument
a ser substituído no documento correspondente(Opcional)
replaceOptions
especifica opções que você pode definir para personalizar como o driver executa a operação de substituição. Para saber mais sobre esse tipo, consulte a documentação da API para ReplaceOptions.
Substituir um exemplo
A loja de tintas entende que precisa atualizar seu estoque novamente. O que eles pensaram ser 20 latas de tinta laranja é, na verdade, 25 latas de tinta laranja.
Para atualizar o inventário, chame o método replaceOne()
especificando o seguinte:
Filtro de query que corresponde a documentos onde o
color
é "pink"documento de substituição em que o
color
é "orange" e oqty
é "25"
val filter = Filters.eq(PaintOrder::color.name, "pink") val update = PaintOrder(5, "orange", 25) val result = collection.replaceOne(filter, update) println("Matched document count: $result.matchedCount") println("Modified document count: $result.modifiedCount")
Matched document count: 1 Modified document count: 1
A seguir, mostra o documento atualizado:
{ "_id": 5, "color": "orange", "qty": 25 }
Se vários documentos corresponderem ao filtro de query especificado no método replaceOne()
, ele substituirá o primeiro resultado. Você pode especificar uma classificação em uma instância do ReplaceOptions
para aplicar um pedido aos documentos correspondentes antes que o driver execute a operação de substituição, conforme mostrado no código a seguir:
val opts = ReplaceOptions().sort(Sorts.ascending(PaintOrder::color.name))
Se zero documentos corresponderem ao filtro de query na operação de substituição, replaceOne()
não fará alterações nos documentos na coleção.Consulte o guia Upsert para saber como inserir um novo documento em vez de substituir um se nenhum documento corresponder.
Importante
O método replaceOne()
não pode fazer alterações em um documento que viole restrições de índice único na collection. Consulte o manual do servidor MongoDB para obter mais informações sobre índices únicos.