Aunque MongoDB admite transacciones multidocumento para sets de réplicas y clústeres particionados, para muchos escenarios, el modelo de datos desnormalizado, 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 único documento es atómica. Para los campos que deben actualizarse juntos, integrar los campos en el mismo documento garantiza que puedan actualizarse de manera atómica.
Por ejemplo, considera una situación en la que necesitas mantener información sobre libros, incluyendo el número de copias disponibles para préstamo, así como la información actual de los préstamos.
Las copias disponibles del libro y la información de préstamo deben estar sincronizadas. Por lo tanto, incrustar el campo available y el campo checkout dentro del mismo documento asegura que puedas actualizar ambos campos de manera 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 checkout, puedes usar el método db.collection.updateOne() para actualizar atómicamente tanto el campo available como el campo checkout:
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 1 documento coincidió con la condición de actualización, y modifiedCount muestra que la operación actualizó 1 documento.
Si ningún documento coincidía con la condición de actualización, entonces matchedCount y modifiedCount serían 0 e indicarían que no podía sacar el libro.