Dados de modelo para operações atômicas
Nesta página
Embora o MongoDB ofereça suportea transações de vários documentos para conjuntos de réplicas e clusters fragmentados, para muitos cenários, o modelo de dados desnormalizado, conforme discutido nesta página, continuará a ser ideal para seus dados e casos de uso.
Padrão
No MongoDB, uma operação de gravação em um único documento é atômica. Para campos que devem ser atualizados juntos, a incorporação dos campos no mesmo documento garante que os campos possam ser atualizados atomicamente.
Por exemplo, considere uma situação em que você precisa manter informações sobre livros, incluindo o número de cópias disponíveis para checkout, bem como as informações atuais de checkout.
As cópias disponíveis do livro e as informações de finalização da compra devem estar sincronizadas. Dessa forma, incorporar o campo available
e o campo checkout
no mesmo documento garante que você possa atualizar os dois campos atomicamente.
{ _id: 123456789, title: "MongoDB: The Definitive Guide", author: [ "Kristina Chodorow", "Mike Dirolf" ], published_date: ISODate("2010-09-24"), pages: 216, language: "English", publisher_id: "oreilly", available: 3, checkout: [ { by: "joe", date: ISODate("2012-10-15") } ] }
Em seguida, para atualizar com novas informações de checkout, você pode utilizar o método db.collection.updateOne()
para atualizar atomicamente o campo available
e o campo checkout
:
db.books.updateOne ( { _id: 123456789, available: { $gt: 0 } }, { $inc: { available: -1 }, $push: { checkout: { by: "abc", date: new Date() } } } )
A operação retorna um documento que contém informações sobre o status da operação:
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
O campo matchedCount
mostra que 1
documento correspondeu à condição de atualização e modifiedCount
mostra que a operação atualizou 1
documento.
Se nenhum documento corresponder à condição de atualização, então matchedCount
e modifiedCount
seriam 0
e indicariam que você não poderia fazer o check-out do livro.