对原子操作的数据进行建模
在此页面上
尽管MongoDB支持副本集和分分片的集群的多文档事务,但在许多情况下,本页所讨论的非规范化数据模型仍将是您的数据和使用案例的最佳选择。
模式
在 MongoDB 中,对单个文档的写入操作具有原子性。对于必须共同更新的字段,将字段嵌入到同一文档中可确保自动更新字段。
例如,考虑这样一种情况,您需要维护图书信息,包括可供借出的图书数量以及当前的借出信息。
可供借出的图书数量和借出信息应该一致。因此,将 available
字段和 checkout
字段嵌入同一文档中可确保能够自动更新这两个字段。
{ _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") } ] }
然后,要使用新的借出信息进行更新,可以使用 db.collection.updateOne()
方法自动更新 available
字段和 checkout
字段:
db.books.updateOne ( { _id: 123456789, available: { $gt: 0 } }, { $inc: { available: -1 }, $push: { checkout: { by: "abc", date: new Date() } } } )
该操作会返回一份包含操作状态信息的文档:
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
matchedCount
字段显示 1
个文档符合更新条件,而 modifiedCount
显示操作更新了 1
个文档。
如果没有文档符合更新条件,则 matchedCount
和 modifiedCount
将为 0
,并指示无法借出该图书。