为原子操作建模数据
本页内容
尽管 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
,这表示您无法借阅书籍。