MongoDB 基础系列七:数据建模之特殊情况一,原子操作

前言

此篇博文是 Mongdb 基础系列之一;主要介绍 MongoDB 的数据建模相关内容;

本文为作者的原创作品,转载需注明出处;

Model Data for Atomic Operations

有原子性要求的数据该如何进行建模?

在 MongoDB 中,任何写入操作,比如 db.collection.update(), db.collection.findAndModify(), db.collection.remove() 的原子性操作均是作用在某一个 document 之上的;如果多个字段必须在同一个事务中同时进行修改,那么必须将这些字段嵌入到一个 document 之中;比如,我们有这样一个例子,某图书可售卖的数量用 available 字段存储以及当前已经卖出的信息由 checkout 字段存储,当某本数被售卖的同时,availablecheckout 字段值必须同时进行修改;因此,必须将这两个字段值放到同一个 document 中,当 update 操作发生时,才能确保在同一个事务当中;

1
2
3
4
5
6
7
8
9
10
11
{
_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.update() 方法在一个事务中来同时修改 availablecheckout 信息;如下所述,

1
2
3
4
5
6
7
db.books.update (
{ _id: 123456789, available: { $gt: 0 } },
{
$inc: { available: -1 },
$push: { checkout: { by: "abc", date: new Date() } }
}
)

上述操作将返回一个 WriteResult() 对象,该对象中包含了上述更新操作的返回状态值;

1
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

nMatched : 1 表示有一个 document 匹配了该 update 操作的条件,nModified : 1 表示该操作更新了一个 document;如果 nMatched 和 nModified 返回为 0,表示没有任何记录被匹配和被修改;

References

https://docs.mongodb.com/manual/applications/data-models-applications/