Aunque MongoDB admite Transacciones de múltiples documentos para conjuntos de réplicas y clústeres fragmentados: para muchos escenarios, el modelo de datos desnormalizados, como se analiza en esta página, seguirá siendo óptimo para sus datos y casos de uso.
Patrón
En MongoDB, una operación de escritura en un solo documento es atómica. Para los campos que deben actualizarse conjuntamente, incrustarlos en el mismo documento garantiza que se actualicen automáticamente.
Por ejemplo, considere una situación en la que necesita mantener información sobre libros, incluido el número de copias disponibles para préstamo, así como la información de préstamo actual.
Las copias disponibles del libro y la información de préstamo deben estar sincronizadas. Por lo tanto, al incrustar... available El campo y el campo checkout dentro del mismo documento garantizan que pueda actualizar los dos campos de forma atómica.
{ _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") } ] }
Luego, para actualizar con nueva información de pago, puede usar el db.collection.updateOne() método para actualizar de forma atómica tanto el available campo como el checkout campo:
db.books.updateOne ( { _id: 123456789, available: { $gt: 0 } }, { $inc: { available: -1 }, $push: { checkout: { by: "abc", date: new Date() } } } )
La operación devuelve un documento que contiene información sobre el estado de la operación:
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
El campo matchedCount muestra que el documento 1 coincidió con la condición de actualización y modifiedCount muestra que la operación actualizó el documento 1.
Si ningún documento coincide con la condición de actualización, entonces matchedCount y modifiedCount serían 0 e indicarían que no se pudo retirar el libro.