Разница между 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, потому что вы делаете обновление. Удалить всегда быстрее.