DeprecationWarning:不推荐使用collection.findAndModify.请改用findOneAndUpdate,findOneAndReplace或findOneAndDelete?

Sud*_*aur 33 deprecated mongoose mongodb node.js

我正在使用猫鼬findOneAndUpdate但仍然得到错误,

DeprecationWarning:不推荐使用collection.findAndModify.请改用findOneAndUpdate,findOneAndReplace或findOneAndDelete.

但我甚至没有使用findAndModify,为什么它将我的查询转换为findAndModify

Shi*_*dey 50

您需要设置查询选项useFindAndModifyfalse,如提到的文档.

(搜索关键字目前支持的选项是)

'useFindAndModify':默认为true.设置为false以使findOneAndUpdate()和findOneAndRemove()使用本机findOneAndUpdate()而不是findAndModify().

如果你看到mongoose的定义文件,那里提到它调用findAndModify更新命令.

 /**
  * 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>;
Run Code Online (Sandbox Code Playgroud)

最近在mongoose docs(点击这里)更新了这些弃用,如下所述:

Mongoose的findOneAndUpdate()很早就预定了MongoDB驱动程序的findOneAndUpdate()函数,因此它使用了MongoDB驱动程序的findAndModify()函数.

有三种方法可以避免使用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);
Run Code Online (Sandbox Code Playgroud)
  1. 在连接级别:我们可以使用连接选项进行配置:
    mongoose.connect(uri, { useFindAndModify: false });
Run Code Online (Sandbox Code Playgroud)
  1. 在查询级别:
   await ModelName.findOneAndUpdate({matchQuery},
   {$set: updateData}, {useFindAndModify: false});

Run Code Online (Sandbox Code Playgroud)


Ikr*_*ula 13

像这样全局更改mongoose配置:

mongoose.set('useFindAndModify', false);
Run Code Online (Sandbox Code Playgroud)

或者传递查询字符串中的选项,如下所示:

Person.findOneAndUpdate({_id: id}, {$set: body}, {new: true, useFindAndModify: false}).then(..
Run Code Online (Sandbox Code Playgroud)

您还可以将其他猫鼬弃用警告作为提及文档进行管理

mongoose.set('useNewUrlParser', true);
mongoose.set('useCreateIndex', true);
Run Code Online (Sandbox Code Playgroud)

而已.


小智 5

您还可以在连接中将需求选项与require选项一起传递useNewUrlParser。查看以下内容-> https://mongoosejs.com/docs/deprecations.html

mongoose.connect(config.MONGODB_URI, { useNewUrlParser: true, useFindAndModify: false}); 
Run Code Online (Sandbox Code Playgroud)


Dev*_*esh 5

您必须更改连接方法选项才能消除错误:

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

你可以像这样使用它。


小智 5

Mongoose 版本更新如此之多,

使用Model.findByIdAndUpdate()它需要一个选项参数,另见下文

List.findByIdAndUpdate(id, update, options, callback) // executes
Run Code Online (Sandbox Code Playgroud)

为了解决这个问题

在开始时将其传递useFindAndModify: false到 mongoose.connect 中

mongoose.connect("mongodb://localhost:27017/yourDatabase", { useNewUrlParser: true, useUnifiedTopology: true ,useFindAndModify: false });
Run Code Online (Sandbox Code Playgroud)

或者

mongoose.set('useFindAndModify', false); 
Run Code Online (Sandbox Code Playgroud)

点击此处查看相关弃用信息