Атомарные операции MongoDB
MongoDB не поддерживает транзакции, поэтому при применении в вашем проекте нужно обратить на это внимание. Какой бы дизайн вы ни использовали, не требуйте, чтобы MongoDB гарантировала целостность данных.
Однако MongoDB предоставляет множество атомарных операций, таких как сохранение документа, изменение, удаление и т. д., и все они являются атомарными операциями.
Атомарная операция означает, что документ либо сохраняется в MongoDB, либо не сохраняется в MongoDB; никогда не будет ситуации, когда запрашиваемый документ сохранён не полностью.
Модель данных атомарных операций
Рассмотрим следующий пример с библиотечными книгами и информацией о выдаче.
Пример показывает, как обеспечить синхронизацию полей, связанных с атомарными операциями (update: update) встроенных полей в одном документе.
book = {
_id: 123456789,
title: "MongoDB: The Definitive Guide",
author: [ "Kristina Chodorow", "Mike Dirolf" ],
published_date: ISODate("2010-09-24"),
pages: 216,
language: "English",
publisher_id: "oreilly",
available: 3,
checkout: [ { by: "joe", date: ISODate("2012-10-15") } ]
}
Вы можете использовать метод db.collection.findAndModify(), чтобы определить, можно ли выдать книгу, и обновить информацию о новой выдаче.
Встраивайте поля available и checkout в один и тот же документ, чтобы гарантировать синхронное обновление этих полей:
db.books.findAndModify ( {
query: {
_id: 123456789,
available: { $gt: 0 }
},
update: {
$inc: { available: -1 },
$push: { checkout: { by: "abc", date: new Date() } }
}
} )
Общие команды для атомарных операций
$set
Используется для указания ключа и обновления его значения; если ключ не существует, он будет создан.
{ $set : { field : value } }
$unset
Используется для удаления ключа.
{ $unset : { field : 1} }
$inc
С помощью $inc можно выполнять операции инкремента/декремента над ключом, значение которого является числовым (только числа, удовлетворяющие требованиям), в документе.
{ $inc : { field : value } }
$push
Использование:
{ $push : { field : value } }
Добавляет значение в поле. Поле должно быть типа массив. Если поле не существует, будет добавлено новое поле типа массив.
$pushAll
То же, что и $push, за исключением того, что в поле массива можно добавить несколько значений за один раз.
{ $pushAll : { field : value_array } }
$pull
Удалить значение, равное value, из поля массива.
{ $pull : { field : _value } }
$addToSet
Добавить значение в массив, но только если значения еще нет в массиве.
$pop
Удалить первый или последний элемент массива.
{ $pop : { field : 1 } }
$rename
Изменить имя поля.
{ $rename : { old_field_name : new_field_name } }
$bit
Побитовая операция, целочисленный тип.
{$bit : { field : {and : 5}}}
Оператор смещения.
> t.find() { "_id" : ObjectId("4b97e62bf1d8c7152c9ccb74"), "title" : "ABC", "comments" : [ { "by" : "joe", "votes" : 3 }, { "by" : "jane", "votes" : 7 } ] }
> t.update( {'comments.by':'joe'}, {$inc:{'comments.$.votes':1}}, false, true )
> t.find() { "_id" : ObjectId("4b97e62bf1d8c7152c9ccb74"), "title" : "ABC", "comments" : [ { "by" : "joe", "votes" : 4 }, { "by" : "jane", "votes" : 7 } ] }
Другие расширения