Model Data for Atomic Operations原子操作的模型数据
On this page本页内容
Although MongoDB supports multi-document transactions for replica sets (starting in version 4.0) and sharded clusters (starting in version 4.2), for many scenarios, the denormalized data model, as discussed on this page, will continue to be optimal for your data and use cases.尽管MongoDB支持副本集(从4.0版开始)和分片集群(从4.2版开始)的多文档事务,但对于许多场景,如本页所述,非规范化数据模型将继续是您的数据和用例的最佳选择。
Pattern模式
In MongoDB, a write operation on a single document is atomic. For fields that must be updated together, embedding the fields within the same document ensures that the fields can be updated atomically.在MongoDB中,对单个文档的写操作是原子操作。对于必须一起更新的字段,将字段嵌入到同一文档中可以确保字段可以原子更新。
For example, consider a situation where you need to maintain information on books, including the number of copies available for checkout as well as the current checkout information.例如,考虑一种情况,您需要维护书籍的信息,包括可供签出的副本数量以及当前签出信息。
The available copies of the book and the checkout information should be in sync. 该书的可用副本和结账信息应该同步。As such, embedding the 因此,在同一文档中嵌入available
field and the checkout
field within the same document ensures that you can update the two fields atomically.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") } ]
}
Then to update with new checkout information, you can use the 然后,要使用新的签出信息进行更新,可以使用db.collection.updateOne()
method to atomically update both the available
field and the checkout
field:db.collection.updateOne()
方法原子更新available
字段和checkout
字段:
db.books.updateOne (
{ _id: 123456789, available: { $gt: 0 } },
{
$inc: { available: -1 },
$push: { checkout: { by: "abc", date: new Date() } }
}
)
The operation returns a document that contains information on the status of the operation:操作返回一个文档,该文档包含有关操作状态的信息:
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
The matchedCount
field shows that 1
document matched the update condition, and modifiedCount
shows that the operation updated 1
document.matchedCount
字段显示1
个文档符合更新条件,modifiedCount
显示操作更新了1
个文档。
If no document matched the update condition, then 如果没有文档符合更新条件,那么matchedCount
and modifiedCount
would be 0
and would indicate that you could not check out the book.matchedCount
和modifiedCount
将为0
,并表示您无法签出该书。