Menu Docs
Página inicial do Docs
/ / /
Kotlin Coroutine
/ / /

Modificar documentos

Nesta página

  • Visão geral
  • Update
  • Atualizar parâmetros de operação
  • Atualizar um exemplo
  • Atualizar muitos exemplos
  • Substituir
  • Substituir parâmetros de operação
  • Substituir um exemplo

Neste guia, você pode aprender como modificar documentos em uma coleção MongoDB usando dois tipos de operação distintos:

  • Update

  • Substituir

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(
@BsonId val id: Int,
val color: String,
val qty: Int
)

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>)

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ção

  • updateDocument 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.

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))

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.

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>)

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ção

  • replacementDocument especifica campos e valores de um novo objeto Document 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.

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 o qty é "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.

Voltar

Exclua documentos