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