2014-02-15 42 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