Aunque MongoDB admite transacciones multi-documento para sets de réplicas y clústeres fragmentados, para muchos escenarios, el modelo de datos desnormalizado, como se analiza en esta página, seguirá siendo óptimo para tus 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, la integración de available campo y el campo checkout dentro del mismo documento garantizan 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.