2

在 mongodb 手册中,有一个针对单个文档的原子操作的示例。

book = {
          _id: 123456789,
          title: "MongoDB: The Definitive Guide",
          available: 3,
          checkout: [ { by: "joe", date: ISODate("2012-10-15") } ]
        }

手册指出以下操作是原子的:

db.books.findAndModify ( {
   query: {
            _id: 123456789,

            available: { $gt: 0 }
          },
   update: {
             $inc: { available: -1 },
             $push: { checkout: { by: "abc", date: new Date() } }
           }
} )

我的问题是如果可用字段是嵌入式文档会发生什么。比如下图:

book = {
          _id: 123456789,
          title: "MongoDB: The Definitive Guide",
          available: [ { value: 3, valueFloat: 3.00 ] },
          checkout: [ { by: "joe", date: ISODate("2012-10-15") } ]
        }

我还能原子地做这个操作吗?如果是这样,怎么做?

4

1 回答 1

4

由于子文档基本上只是主文档中的字段,因此对它们的任何更新也是原子的。

MongoDB 每个文档都有事务,适用于整个文档,包括其子文档。

需要注意的是,不仅仅是findAndModify原子的。对单个文档的任何操作,无论是原子update()操作。remove()

于 2014-02-15T13:57:20.990 回答