2014-02-15 30 views
1

在mongodb手册中,有一个用于在单个文档上进行原子操作的examplefindAndModify对嵌入文档的原子性

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

我仍然可以做原子操作吗?如果是这样,怎么样?

回答

3

由于子文档基本上只是主文档中的字段,所以对它们的更新也是原子性的。

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

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

+0

非常感谢。调用find(_id)然后update(_id,newvalue)和调用findandmodify(_id,newvalue)之间的区别在于可以在find()和update()调用之间更新文档。但是使用findAndModify,在findAndModify执行完成之前,不能对文档进行其他读/写操作。我对么?我想这就是为什么选择这个例子?再次感谢,这真的有帮助。 –

+0

@AntonAnsgar确实可能会有干扰,但是如果您使用查找条件调用update,那么它是原子的,与findandmodify一样 – Sammaye