mongodb 弃用警告:不推荐使用findAndModify,是否改用findOneAndUpdate、findOneAndReplace或findOneAndDelete?

inb24sb2  于 2022-11-03  发布在  Go
关注(0)|答案(9)|浏览(288)

我正在使用mongoose findOneAndUpdate,但仍然出现错误,
弃用警告:不推荐使用findAndModify。请改用findOneAndUpdate、findOneAndReplace或findOneAndDelete。
但是我甚至没有使用findAndModify,为什么它要将我的查询转换为findAndModify

xtfmy6hx

xtfmy6hx1#

您需要将查询useFindAndModify中的选项设置为false,如docs中所述。
(搜索关键字当前支持的选项为
'使用查找和修改':默认情况下为true。设置为false可使findOneAndUpdate()和findOneAndRemove()使用本机findOneAndUpdate(),而不是findAndModify()。
如果您看到mongoose的定义文件,其中提到它调用findAndModify 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文档(单击此处)中更新了以下提到的不赞成使用的内容:
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});
sf6xfgos

sf6xfgos2#

全局更改mongoose配置,如下所示:

mongoose.set('useFindAndModify', false);

或者在查询字符串中传递如下选项:

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

您还可以管理其他mongoose过时警告,如docs所述

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

就这样了。

8nuwlpux

8nuwlpux3#

您也可以在连接处使用requirement选项useNewUrlParser来传递选项。

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

1tuwyuhd4#

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

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

你可以这样使用它。

f45qwnt8

f45qwnt85#

Mongoose版本更新如此之多,
对于使用Model.findByIdAndUpdate(),它需要一个选项参数,也请参见下文

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

为了解决这个问题
在mongoose中传递此useFindAndModify: false

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

mongoose.set('useFindAndModify', false);

单击此处查看相关的弃用版本

at0kjp5o

at0kjp5o6#

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

这些解决方案对我很有效!

92vpleto

92vpleto7#

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

跳过所有错误:-)将其添加到index.js或任何您命名的文件中。我指的是主js文件。- )

rdrgkggo

rdrgkggo8#

要修复所有过时警告,请执行以下步骤:

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

将update()替换为updateOne()、updateMany()或replaceOne()将remove()替换为deleteOne()或deleteMany()。将count()替换为countDocuments(),除非您要计算整个集合中的文档数(无筛选器)。在后一种情况下,请使用estimatedDocumentCount()。

9cbw7uwe

9cbw7uwe9#

将package.json中的mongoose版本更改为5X(降级)并运行npm i以reiantall,然后运行npm start。这将解决此问题。

相关问题