В чем разница между findAndModify и update в MongoDB?

Я немного смущенfindAndModify метод в MongoDB. В чем его преимущество передupdate метод? Мне кажется, что сначала он просто возвращает элемент, а затем обновляет его. Но зачем мне сначала возвращать товар? Я прочиталMongoDB: the definitive guide и это говорит, что это удобно для управления очередями и выполнения других операций, которые требуют атомарности стиля get-and-set. Но я не понимаю, как это достигается. Может кто-нибудь объяснить это мне?

Ответы на вопрос(4)

Одним полезным классом вариантов использования являются счетчики и аналогичные случаи. Например, взгляните на этот код (один из тестов MongoDB): find_and_modify4.js.

Таким образом, сfindAndModify Вы увеличиваете счетчик и получаете его увеличенный значение в один шаг. Сравните: если вы (A) выполняете эту операцию в два этапа и кто-то другой (B) делает ту же операцию между вашими шагами, тогда A и B могут получить одно и то же значение последнего счетчика вместо двух разных (только один пример возможных проблем).

Решение Вопроса

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

Делать это "атомарно" означает, что вам гарантировано, что вы возвращаете тот же самый элемент, который обновляете, то есть никакая другая операция не может произойти между ними.

 28 мая 2012 г., 11:28
@chaonextdoor findAndModify получает блокировку базы данных при запуске операции, поэтому никакая другая операция не может быть обработана при ее выполнении. Когда он заканчивает операцию, он снимает блокировку.
 30 апр. 2013 г., 05:07
@MarkUnsworth откройте службу поддержки с 10gen - если есть ошибка в блокировке с помощью findAndModify, я могу гарантировать, что инженеры захотят исправить это как можно скорее. Если бы это было так, хотя мы бы увидели, что многие люди сообщают об этом поведении, но findAndModify работает так, как предназначено для почти всех, кто его использует - в тех случаях, когда казалось, что это не связано с ошибками логики или реализации на стороне клиента , но, конечно, в сложных программах всегда может быть ошибка.
 18 сент. 2015 г., 18:30
@AsyaKamsky Я собирался поспорить с тобой, но потом понял, что ты прав, поэтому теперь я думаю, что должен извиниться. Сожалею!
 chaonextdoor28 мая 2012 г., 06:44
Я все еще немного сбит с толку. КакfindAndModify гарантировать, что нет другой операции обновления, мешающей ему?
 19 мар. 2013 г., 18:28
findAndModify фактически не получает блокировку до тех пор, пока не будет изменена часть запроса. Таким образом, несколько процессов могут иметь возможность обновлять одну и ту же запись.

ОтMongoDB документы (выделение добавлено):

By default, both operations modify a single document. However, the update() method with its multi option can modify more than one document.

If multiple documents match the update criteria, for findAndModify(), you can specify a sort to provide some measure of control on which document to update. With the default behavior of the update() method, you cannot specify which single document to update when multiple documents match.

By default, findAndModify() method returns the pre-modified version of the document. To obtain the updated document, use the new option. The update() method returns a WriteResult object that contains the status of the operation. To return the updated document, use the find() method. However, other updates may have modified the document between your update and the document retrieval. Also, if the update modified only a single document but multiple documents matched, you will need to use additional logic to identify the updated document.

You cannot specify a write concern to findAndModify() to override the default write concern whereas, starting in MongoDB 2.6, you can specify a write concern to the update() method.

When modifying a single document, both findAndModify() and the update() method atomically update the document.

 09 авг. 2018 г., 10:18
Ошибок нет - arrayFilters позволяет обновлять несколько элементов массива, но они все еще находятся в одном документе.
 30 сент. 2017 г., 21:33
Вы всегда можете указать отношение записи к операции обновления. Кроме того, начиная с версии 3.2 (технически 3.1.1), вы также можете указать, что пишите для findAndModify.jira.mongodb.org/browse/SERVER-6558
 16 февр. 2018 г., 15:18
Я обнаружил, что в MongDB 3.6, хотя в документе говоритсяfindAndModify() по умолчанию изменяет только один документ иupdate() может обновить один или несколько документов, когда я используюarrayFilters, findAndModify() обновляет все совпадения. Может быть, это ошибка?

findAndModify возвращает документ, обновление - нет.

Если я правильно понял Дуайта Мерримана (одного из первоначальных авторов mongoDB), я использую обновление для изменения одного документа, т.е.findAndModify.

Ваш ответ на вопрос