Атомарные операции 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 } ] }
Другие расширения