MongoDB findAndModify атомарность

Я хочу знать, как ссылаться на возвращенные атрибуты документа из поиска и использовать их при изменении. Бывший. :

var totalNoOfSubjects = 5;
db.people.findAndModify( {
    query: { name: "Tom", state: "active", rating: { $gt: 10 } },
    sort: { rating: 1 },
    update: { $set: { average: <reference score value returned by find>/totalNoOfSubjects} }
    } );

Насколько я понимаю, findAndModify блокирует документ, поэтому я хочу выполнить обновление в модификации, используя атрибуты, найденные в find. Это сделает операцию атомарной.

Мне интересно, поддерживается ли это монго.


person Raghu Katti    schedule 12.02.2013    source источник


Ответы (2)


Нет, вы не можете ссылаться на значения в найденном документе во время части обновления файла findAndModify. В этом отношении он такой же, как update.

Таким образом, вы не можете сделать это атомарно, поскольку вам нужно сначала получить документ, а затем создать update или findAndMondify, чтобы содержать значение, вычисленное из вашего извлеченного документа.

См. https://jira.mongodb.org/browse/SERVER-458 для одного способа. это может быть решено в будущем.

person JohnnyHK    schedule 12.02.2013
comment
ценю ответ ... Я бы хотел, чтобы Mongo поддерживал эту функцию, хотя я не могу придумать причину, которая помешала бы ее поддержке. Если $inc может атомарно изменяться, используя возвращенный документ в части поиска, хотя это делается внутри mongo... тогда, аналогично, почему бы не разрешить пользователю также указывать ссылки на значения, возвращаемые из поиска в части обновления... еще раз спасибо - person Raghu Katti; 12.02.2013

Атомарность как раз и является причиной findAndModify.

Как указано в документации, Mongo найдет один или несколько документы (соответствующие указанному query) изменяют один документ (используя указанный update). Весь процесс атомарный. В реализации по умолчанию Mongo возвращает найденный документ (в неизмененном состоянии). Это можно изменить с помощью опции new.

person Sri Sankaran    schedule 12.02.2013
comment
Напротив, поиск и обновление частей команды не являются атомарными. Между поиском и обновлением могут выполняться другие операции. Вот почему его нельзя использовать для обеспечения уникальности поля, и вам потребуется уникальное ограничение. Ссылка: docs.mongodb.com /руководство/справочник/метод/ - person Iravanchi; 16.07.2017
comment
@Iravanchi: по ссылке, на которую вы ссылались, при изменении одного документа и метод findAndModify(), и метод update() атомарно обновляют документ. - person Sri Sankaran; 17.07.2017