Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

DeprecationWarning: collection.findAndModify is deprecated. Use findOneAndUpdate, findOneAndReplace or findOneAndDelete instead?

I am using mongoose findOneAndUpdate but still getting the error,

DeprecationWarning: collection.findAndModify is deprecated. Use findOneAndUpdate, findOneAndReplace or findOneAndDelete instead.

But I am not even using findAndModify, why is it converting my query to findAndModify?

like image 286
Sudhanshu Gaur Avatar asked Sep 29 '18 21:09

Sudhanshu Gaur


People also ask

What can I use instead of findOneAndUpdate?

Mongoose's findOneAndUpdate() long pre-dates the MongoDB driver's findOneAndUpdate() function, so it uses the MongoDB driver's findAndModify() function instead. You can opt in to using the MongoDB driver's findOneAndUpdate() function using the useFindAndModify global option.

Which of the following are options to configure Mongoose to avoid deprecation warnings when using the MongoDB driver *?

To fix all deprecation warnings, follow the below steps: Replace update() with updateOne() , updateMany() , or replaceOne() Replace remove() with deleteOne() or deleteMany() .


2 Answers

You need to set the option in the query useFindAndModify to false, as mentioned in the docs.

(search keyword Currently supported options are)

'useFindAndModify': true by default. Set to false to make findOneAndUpdate() and findOneAndRemove() use native findOneAndUpdate() rather than findAndModify().

and if you see the definition file of mongoose, where mentioned that it calls findAndModify update command.

 /**   * 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>; 

Recently updated in the mongoose docs (Click here) for these deprecation where mentioned:

Mongoose's findOneAndUpdate() long pre-dates the MongoDB driver's findOneAndUpdate() function, so it uses the MongoDB driver's findAndModify() function instead.

There are three ways or more by which you can avoid the use of FindAndModify:

  1. At Global level: Set the option to 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. At connection level: we can configure using the connection options:
    mongoose.connect(uri, { useFindAndModify: false }); 
  1. At Query level:
   await ModelName.findOneAndUpdate({matchQuery},    {$set: updateData}, {useFindAndModify: false});  
like image 188
Shivam Pandey Avatar answered Oct 28 '22 00:10

Shivam Pandey


Change the mongoose configuration globally like this:

mongoose.set('useFindAndModify', false); 

Or pass the options in your query string like this:

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

You can also manage the other mongoose deprecation warnings as mention docs

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

That's it.

like image 41
Ikram - Ud - Daula Avatar answered Oct 28 '22 02:10

Ikram - Ud - Daula