Устаревшее предупреждение: collection.findAndModify устарел. Вместо этого используйте findOneAndUpdate, findOneAndReplace или findOneAndDelete?

Я использую mongoose findOneAndUpdate но все еще получаю ошибку,

Устаревшее предупреждение: collection.findAndModify устарел. Вместо этого используйте findOneAndUpdate, findOneAndReplace или findOneAndDelete.

Но я даже не использую findAndModify, почему он конвертирует мой запрос в findAndModify?

Ответ 1

Вам нужно установить опцию в запросе useFindAndModify в false, как упомянуто в документации.

(ключевое слово поиска В настоящее время поддерживаются следующие варианты)

'useFindAndModify': по умолчанию true. Установите в false, чтобы findOneAndUpdate() и findOneAndRemove() использовали встроенную функцию findOneAndUpdate() вместо findAndModify().

и если вы видите файл определения mongoose, где упоминается, что он вызывает команду updateAndModify update.

 /**
  * Issues a mongodb findAndModify update command.
  * Finds a matching document, updates it according to the update arg, 
    passing any options,
  * and returns the found document (if any) to the callback. The query 
    executes immediately
  * if callback is passed else a Query object is returned.
  */
 findOneAndUpdate(): DocumentQuery<T | null, T>;

Недавно обновленный в документации Мангуста (Нажмите здесь) для этих устаревших, где упоминалось:

Mongoose findOneAndUpdate() долго предшествует функции findOneAndUpdate() драйвера MongoDB, поэтому вместо него он использует функцию findAndModify() драйвера MongoDB.

Существует три или более способов, которыми вы можете избежать использования FindAndModify:

  1. На глобальном уровне: установите для параметра значение false.
// Make Mongoose use 'findOneAndUpdate()'. Note that this option is 'true'
// by default, you need to set it to false.
mongoose.set('useFindAndModify', false);
  1. На уровне подключения: мы можем настроить, используя параметры подключения:
    mongoose.connect(uri, { useFindAndModify: false });
  1. На уровне запроса:
   await ModelName.findOneAndUpdate({matchQuery},
   {$set: updateData}, {useFindAndModify: false});

Ответ 2

Измените конфигурацию Мангуста глобально, как это:

mongoose.set('useFindAndModify', false);

Или передайте параметры в строке запроса следующим образом:

Person.findOneAndUpdate({_id: id}, {$set: body}, {new: true, useFindAndModify: false}).then(..

Вы также можете управлять другими предупреждениями об устаревании мангуста, как упомянуть документы

mongoose.set('useNewUrlParser', true);
mongoose.set('useCreateIndex', true);

Это.

Ответ 3

Вы также можете передать параметры при соединении с обязательным параметром useNewUrlParser. Посмотрите на следующее → https://mongoosejs.com/docs/deprecations.html

mongoose.connect(config.MONGODB_URI, { useNewUrlParser: true, useFindAndModify: false}); 

Ответ 4

Вы должны изменить параметры подключения, чтобы избавиться от него:

mongoose.connect("mongodb://localhost/DB_Name", {
  keepAlive: true,
  useNewUrlParser: true,
  useCreateIndex: true,
  useFindAndModify: false
});

Вы можете использовать как это.