Разница между findOneAndDelete() и findOneAndRemove()
Я не могу различить findOneAndDelete() и findOneAndRemove() в документации мангуста.
Query.prototype.findOneAndDelete()
Эта функция немного отличается от Model.findOneAndRemove() тем, что findOneAndRemove() становится командой findAndModify() MongoDB, в отличие от команды findOneAndDelete(). Для большинства случаев использования мангусты это различие чисто педантичное. Вы должны использовать findOneAndDelete(), если у вас нет веских причин не делать этого.
Ответы
Ответ 1
В mongoose findOneAndDelete работает так же, как findOneAndRemove. Они оба смотрят объект по его свойствам в JSON, затем удаляют его и возвращают объект один раз после удаления. Когда вы используете собственный mongodb в качестве базы данных, findOneAndDelete может быть вам полезен, но в случае с mongoose он устарел, я могу посоветовать вам использовать findOneAndDelete для выполнения ваших операций, основанных на последней конфигурации mongoose и nodejs, как в этот период. https://github.com/Automattic/mongoose/issues/6880
Ответ 2
Я хотел бы предложить вам использовать findOneAndDelete(). Mongoose предоставляет как функции для обработки данных с помощью ORM, так и функции для записи непосредственно в базу данных, причем одна из последних - findOneAndDelete(). Прямая запись в базу данных более опасна, так как вы рискуете не вызывать промежуточное программное обеспечение или средства проверки, потенциально передавая частичные или неполные данные в базу данных. Обратите внимание, что я сказал, что это более опасно, а не что оно опасно, findOneAndDelete() просто проходит через ORM, добавляя безопасность.
Ответ 3
findOneAndRemove возвращает удаленный документ, поэтому, если вы удалите документ, который, по вашему решению, не должен быть удален, вы можете вставить его обратно в базу данных. Прежде чем удалять документ, убедитесь, что ваша логика в порядке, а не после проверки IMO.
findOneAndDelete имеет параметр sort, который можно использовать для определения того, какой документ обновляется. У этого также есть параметр TimeLimit, который может управлять, в пределах которого операция должна завершиться
Ответ 4
В нативном клиенте MongoDB (отличается Mongoose), передача { remove: true }
для findAndModify
заставляет его удалить найденный документ, и его поведение в этом случае будет выглядеть очень похоже на findOneAndDelete
. Однако при использовании других параметров есть некоторые различия:
- findAndModify принимает 5 параметров:
query
, sort
, doc
(объект обновления), options
и callback
. findOneAndDelete занимает всего 3 (filter
или запрос, options
и callback
) -
options
для findAndModify
включают w
, wtimeout
и j
для проблем записи, как:
"уровень подтверждения, запрашиваемый от MongoDB для операций записи в автономный mongod или в наборы реплик или в сегментированные кластеры". или просто уровни гарантии, доступные для сообщения об успешности операции записи.
options
для findOneAndDelete
не включают конфигурацию проблем записи.
-
findAndModify
позволяет вам вернуть новый документ и удалить его одновременно.
Пример:
// Simple findAndModify command returning the new document and
// removing it at the same time
collection.findAndModify({b:1}, [['b', 1]], {$set:{deleted: Date()}}, {remove:true}, calback)
Ответ 5
Пожертвуйте мне upvote :) и ответьте на поставленный выше вопрос. Просто сейчас я тоже запутался с аналогичной вещью при написании тестов - beforeEach
await User.deleteMany()
await User.remove()
Оба работают одинаково, удаляя всю коллекцию перед каждым тестом.
Ответ 6
Они оба почти одинаковы, за исключением того, что findOneAndRemove использует findAndModify с флагом удаления, и сложность по времени будет немного выше по сравнению с findOneAndDelete, потому что вы делаете обновление. Удалить всегда быстрее.