Inserir ou atualizar em uma única operação
Nesta página
Visão geral
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
Especifique um Upsert
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( 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
de606b4cfc1601f9443b5d6978
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: