Атомарность findAndModify для встроенных документов

В руководстве по 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") } ]
        }

Могу ли я по-прежнему выполнять эту операцию атомарно? Если да, то как?


person Emre Kenci    schedule 15.02.2014    source источник


Ответы (1)


Поскольку вложенные документы — это просто поля в основном документе, любые их обновления также являются атомарными.

MongoDB имеет транзакции для каждого документа, и это относится ко всему документу, включая его вложенные документы.

Следует отметить, что не только findAndModify является атомарным. Любая операция над одним документом, будь то update() или remove(), атомарна.

person Sammaye    schedule 15.02.2014
comment
Огромное спасибо. Разница между вызовом find(_id) и затем update(_id, newvalue) и вызовом findandmodify(_id, newvalue) заключается в том, что документ может быть обновлен между вызовами find() и update(). Но с помощью findAndModify никакие другие операции чтения/записи над документом не могут выполняться, пока выполнение findAndModify не будет завершено. Я прав? Я думаю, именно поэтому этот пример выбран? Еще раз спасибо, это действительно помогло. - person Emre Kenci; 15.02.2014
comment
@AntonAnsgar действительно могут быть помехи, но если вы вызываете обновление с условием поиска, то оно атомарно, как и findandmodify - person Sammaye; 15.02.2014