嵌入式文档中findAndModify的原子性

时间:2014-02-15 13:53:07

标签: mongodb atomicity findandmodify

在mongodb手册中,单个文档的原子操作有example

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") } ]
        }

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

1 个答案:

答案 0 :(得分:4)

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

MongoDB具有每个文档的事务,并且适用于整个文档,包括其子文档。

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