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

Inserir ou atualizar em uma única operação

Nesta página

  • Visão geral
  • Especifique um Upsert

Neste guia, você pode aprender como executar um upsert com o driver MongoDB Kotlin.

Os aplicativos usam operações de inserção e atualização para armazenar e modificar dados. Às vezes, você precisa escolher entre inserir e atualizar dependendo da existência do documento. O MongoDB simplifica essa decisão para nós com uma opção upsert .

An upsert:

  • Atualiza documentos que correspondem ao seu filtro de consulta

  • Insere um documento se não houver correspondência com o filtro de queries

Para especificar um upsert com os métodos updateOne() ou updateMany(), passe true para UpdateOptions.upsert().

Para especificar um upsert com o método replaceOne(), passe true para ReplaceOptions.upsert().

No exemplo a seguir, uma loja de tintas vende oito cores diferentes de tinta. A loja tinha sua venda online anual. A coleção paint_inventory agora mostra os seguintes documentos:

{ "_id": { "$oid": "606b4cfbcd83be7518b958da" }, "color": "red", "qty": 5 }
{ "_id": { "$oid": "606b4cfbcd83be7518b958db" }, "color": "purple", "qty": 8 }
{ "_id": { "$oid": "606b4cfbcd83be7518b958dc" }, "color": "blue", "qty": 0 }
{ "_id": { "$oid": "606b4cfbcd83be7518b958dd" }, "color": "white", "qty": 0 }
{ "_id": { "$oid": "606b4cfbcd83be7518b958de" }, "color": "yellow", "qty": 6 }
{ "_id": { "$oid": "606b4cfbcd83be7518b958df" }, "color": "pink", "qty": 0 }
{ "_id": { "$oid": "606b4cfbcd83be7518b958e0" }, "color": "green", "qty": 0 }
{ "_id": { "$oid": "606b4cfbcd83be7518b958e1" }, "color": "black", "qty": 8 }

Esses dados são modelados com a seguinte classe de dados Kotlin:

data class PaintOrder(
@BsonId val id: ObjectId = ObjectId(),
val qty: Int,
val color: String
)

A loja recebeu uma nova remessa e precisa atualizar o estoque. O primeiro item da remessa são dez latas de tinta laranja.

Para atualizar o inventário, faça query da coleção paint_inventory em que color é "orange", especifique uma atualização para increment no campo qty até 10 e especifique true para UpdateOptions.upsert():

val filter = Filters.eq(PaintOrder::color.name, "orange")
val update = Updates.inc(PaintOrder::qty.name, 10)
val options = UpdateOptions().upsert(true)
val results = collection.updateOne(filter, update, options)
println(results)
AcknowledgedUpdateResult{ matchedCount=0, modifiedCount=0, upsertedId=BsonObjectId{ value=606b4cfc1601f9443b5d6978 }}

Este AcknowledgedUpdateResult nos diz:

  • Nenhum documento correspondeu ao nosso filtro de queries

  • Nenhum documento em nossa coleção foi modificado

  • Um documento com _id de 606b4cfc1601f9443b5d6978 foi atualizado

O seguinte mostra os documentos na coleção paint_inventory:

{ "_id": { "$oid": "606b4cfbcd83be7518b958da" }, "color": "red", "qty": 5 }
{ "_id": { "$oid": "606b4cfbcd83be7518b958db" }, "color": "purple", "qty": 8 }
{ "_id": { "$oid": "606b4cfbcd83be7518b958dc" }, "color": "blue", "qty": 0 }
{ "_id": { "$oid": "606b4cfbcd83be7518b958dd" }, "color": "white", "qty": 0 }
{ "_id": { "$oid": "606b4cfbcd83be7518b958de" }, "color": "yellow", "qty": 6 }
{ "_id": { "$oid": "606b4cfbcd83be7518b958df" }, "color": "pink", "qty": 0 }
{ "_id": { "$oid": "606b4cfbcd83be7518b958e0" }, "color": "green", "qty": 0 }
{ "_id": { "$oid": "606b4cfbcd83be7518b958e1" }, "color": "black", "qty": 8 }
{ "_id": { "$oid": "606b4cfc1601f9443b5d6978" }, "color": "orange", "qty": 10 }]

Observação

Não incluir UpdateOptions resulta em nenhuma alteração na coleção.

val filter = Filters.eq(PaintOrder::color.name, "orange")
val update = Updates.inc(PaintOrder::qty.name, 10)
val results = collection.updateOne(filter, update)
println(results)
AcknowledgedUpdateResult{ matchedCount=0, modifiedCount=0, upsertedId=null }

Para obter mais informações sobre os métodos e as classes mencionadas nesta seção, consulte a seguinte documentação da API:

  • UpdateOptions.upsert()

  • ReplaceOptions.upsert()

Voltar

Atualizar Matrizes em um Documento