поиск mongodb с последующей семантикой обновления - PullRequest
1 голос
/ 26 января 2012

Эта страница показывает обновление, попадающее в ранее извлеченный (находящийся) документ и запрашивающее подэлемент (массив) для его обновления.Мне нужно сделать то же самое.Код для примера:

> 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 )

Каковы правила, регулирующие поиск с последующим обновлением, я не заметил объяснения этому в документации.Относится ли то же самое к использованию mongodb через драйверы?Ссылка на соответствующую семантику была бы полезной.Я использую драйвер C ++.

edit: self answer

2 команды можно объединить в одну (и это один из способов устранения неоднозначности, возникающей в этом вопросе)), часть запроса обновления может ссылаться на подэлемент массива, и символ $ будет ссылаться на него.Я предполагаю, что вы можете ссылаться только на один подэлемент в части запроса операции обновления.В моем случае операция обновления выглядит следующим образом:

db.qrs.update ( { "_id" : ObjectId("4f1fa126adf93ab96cb6e848"), "urls.u_id" : 171 }, { "$inc" :  { "urls.$.CC": 1} })

_id правильно "заполняет" правую уникальную строку, а второй элемент запроса "urls.u_id" : 171 гарантирует, что соответствующая строка имеет правильное поле,urls.$.CC затем направляет операцию $inc к правильной записи массива.

Рекомендация любому разработчику mongodb или устройству записи документов

Не показывать примеры с потенциальной расойусловия в них.Всегда избегайте показывать несколько операций, которые можно выполнить атомарно.

1 Ответ

2 голосов
/ 26 января 2012

Правила относительно просты.Результаты обновления могут или не могут быть доступны для любых последующих чтений в зависимости от ряда вещей (slaveOk true / false в сочетании с повторными наборами, обновление и поиск с использованием различных соединений, безопасность записи).Вы можете гарантировать его доступность, если выполните безопасную запись (w> = 1) и выполните поиск для того же соединения.Большинство драйверов предлагают функциональные возможности для этого (обычно «requestStart» и «requestDone»).

При этом для вас существует гораздо лучшее решение, а именно findAndModify.Эта операция находит документ, обновляет его и возвращает либо старую версию документа, либо обновленную версию.Эта команда доступна в драйвере C ++.Для справки смотрите здесь: http://www.mongodb.org/display/DOCS/findAndModify+Command

РЕДАКТИРОВАТЬ: Обратите внимание, что «найти» в примере только там, чтобы показать читателю документации, что структура / схема документов в коллекции дляпоместите последующее «обновление» в контекст.Операция «update» никоим образом не зависит от операции «find» перед ней.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...