Я немного смущен findAndModify
методом в MongoDB. В чем преимущество этого update
метода? Мне кажется, что сначала он просто возвращает элемент, а затем обновляет его. Но зачем мне сначала возвращать товар? Я прочитал MongoDB: полное руководство, в котором говорится, что оно удобно для манипулирования очередями и выполнения других операций, требующих атомарности в стиле get-and-set. Но я не понял, как это достигается. Может кто-нибудь объяснить это мне?
175
findAndModify
гарантировать, что никакая другая операция обновления не мешает ему?findAndModify
возвращает документ, обновление - нет.Если я правильно понял Дуайта Мерримана (одного из первоначальных авторов mongoDB), я использую update для изменения одного документа, т. Е. («Multi»: false} также является атомарным. В настоящее время это также должно быть быстрее, чем использование эквивалентного обновления с использованием
findAndModify
.источник
Из документов MongoDB (выделение добавлено):
источник
findAndModify()
по умолчанию изменяют только один документ иupdate()
могут обновлять один или несколько документов, когда я используюarrayFilters
,findAndModify()
обновляет все совпадения. Может быть, это ошибка?Одним полезным классом вариантов использования являются счетчики и аналогичные случаи. Например, взгляните на этот код (один из тестов MongoDB): find_and_modify4.js .
Таким образом,
findAndModify
вы увеличиваете счетчик и получаете его увеличенное значение за один шаг. Сравните: если вы (A) выполняете эту операцию в два этапа, а кто-то другой (B) выполняет ту же операцию между вашими шагами, то A и B могут получить одно и то же значение последнего счетчика вместо двух разных (только один пример возможных проблем).источник
Мы использовали findAndModify () для операций Counter (inc или dec) и других случаев мутации отдельных полей. Перенеся наше приложение из Couchbase в MongoDB, я нашел этот API для замены кода, который выполняет GetAndlock (), локального изменения содержимого, замены () для сохранения и получения снова () для получения обновленного документа. С mongoDB я просто использовал этот единственный API, который возвращает обновленный документ.
источник