DeprecationWarning:不建议使用collection.findAndModify。改用findOneAndUpdate,findOneAndReplace或findOneAndDelete吗?

时间:2018-09-29 21:53:49

标签: node.js mongodb mongoose deprecated

我正在使用猫鼬findOneAndUpdate,但仍然收到错误消息,

  

DeprecationWarning:不建议使用collection.findAndModify。改用findOneAndUpdate,findOneAndReplace或findOneAndDelete。

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

7 个答案:

答案 0 :(得分:29)

您需要将查询useFindAndModify中的选项设置为false,如docs中所述。

(搜索关键字当前受支持的选项是

  

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

,如果您看到猫鼬的定义文件,则提到它调用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>;

最近在猫鼬文档(Click here)中针对以下提及的弃用进行了更新:

  

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

答案 1 :(得分:11)

像这样全局更改猫鼬配置:

mongoose.set('useFindAndModify', false);

或者像这样在查询字符串中传递选项:

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

您还可以管理其他猫鼬弃用警告,如提及docs

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

就是这样。

答案 2 :(得分:5)

您还可以在连接处通过需求选项useNewUrlParser传递这些选项。查看以下内容-> https://mongoosejs.com/docs/deprecations.html

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

答案 3 :(得分:2)

猫鼬版本的更新如此之大,

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

List.findByIdAndUpdate(id, update, options, callback) // executes

解决此问题

将此useFindAndModify: false传递到mongoose.connect的开头

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

mongoose.set('useFindAndModify', false); 

clickhere检查相关的弃用情况

答案 4 :(得分:0)

您必须更改连接方法选项才能摆脱它:

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

您可以像这样使用。

答案 5 :(得分:0)

Mongoose.connect(Config.database,{useUnifiedTopology: true,useNewUrlParser: true,useFindAndModify:false});

跳过所有错误:-) 将此添加到index.js或您命名的任何名称上。我的意思是主要的js文件。 ;-)

答案 6 :(得分:0)

  mongoose.set('useNewUrlParser', true);
  mongoose.set('useFindAndModify', false);
  mongoose.set('useCreateIndex', true);
  mongoose.set('useUnifiedTopology', true);

这些解决方案对我有用!