Эта страница показывает обновление, попадающее в ранее извлеченный (находящийся) документ и запрашивающее подэлемент (массив) для его обновления.Мне нужно сделать то же самое.Код для примера:
> 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 или устройству записи документов
Не показывать примеры с потенциальной расойусловия в них.Всегда избегайте показывать несколько операций, которые можно выполнить атомарно.