2014-02-15 5 views
1

В руководстве mongodb имеется example для атомных операций на одном документе.Атомность findAndModify на вложенных документах

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), а затем обновлением (_id, newvalue) и вызовом findandmodify (_id, newvalue) заключается в том, что документ может быть обновлен между вызовами find() и update(). Но с помощью findAndModify никакие другие операции чтения/записи не могут быть сделаны в документе до завершения выполнения findAndModify. Я прав? Наверное, поэтому этот пример выбран? Еще раз спасибо, это действительно помогло. –

+0

@AntonAnsgar действительно может быть интерференция, но если вы вызываете обновление с условием поиска, то он является атомарным, так же, как findandmodify – Sammaye

Смежные вопросы