弃用警告:collection.findAndModify已被弃用。请改用findOneAndUpdate、findOneAndReplace或findOneAndDelete?

94

我正在使用mongoose的findOneAndUpdate,但仍然遇到错误:

警告:collection.findAndModify已弃用。请改用findOneAndUpdate、findOneAndReplace或findOneAndDelete。

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


你使用的mongoose版本是哪个? - Shivam Pandey
@ShivamPandey 最新版本是 5.3.0 - Sudhanshu Gaur
它最近才发布。我认为他们应该在发布中添加更改日志。 - Shivam Pandey
1
当我使用findByIdAndUpdate时出现了警告。 - Thai Ha
参考:https://dev59.com/Pq7la4cB1Zd3GeqPc3B6#55980131 - Rahul Shukla
对于谷歌员工来说,警告信息中的URL已经过时。这是实际的URL:https://mongoosejs.com/docs/5.x/docs/deprecations.html#findandmodify - Joel Harris
9个回答

147
你需要在查询中设置选项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>;

最近更新的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);

在连接级别:我们可以使用连接选项进行配置:
    mongoose.connect(uri, { useFindAndModify: false });

在查询级别上:
   await ModelName.findOneAndUpdate({matchQuery},
   {$set: updateData}, {useFindAndModify: false});


为什么这不是默认设置呢?我只想安心地更新我的文档。 - Bersan

27

像这样全局更改 mongoose 配置:

mongoose.set('useFindAndModify', false);

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

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

您还可以按照文档提到的方式管理其他 mongoose 废弃警告。


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

就是这样。


谢谢这个解决方案,我使用了 {new: true, useFindAndModify: false}。 - Hasoun GH
1
这真的起作用了!- {new: true, useFindAndModify: false} - Tanvir Islam Streame

8

您还可以在连接时使用useNewUrlParser选项传递要求选项。请参见以下内容 -> https://mongoosejs.com/docs/deprecations.html

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

5

您需要更改连接方法选项以消除错误:

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

你可以像这样使用它。

5

Mongoose版本更新很频繁,

使用Model.findByIdAndUpdate()需要传递一个选项参数,如下所示:

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

解决方法:

在开始时,通过 mongoose.connect 中传递 useFindAndModify: false 来解决此问题。

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

或者
mongoose.set('useFindAndModify', false); 

点击此处查看相关废弃通知。


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

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

1
为了解决所有弃用警告,请按照以下步骤操作:
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()。


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

要跳过所有错误 :-) 在你的index.js或者其他命名的主js文件中加入这个。;-)


0

在 package.json 中将 mongoose 版本降级为 5X,然后运行 npm i 进行重新安装,最后运行 npm start。这样可以解决问题。


2
推荐降级并不能帮助用户解决弃用问题,这只是掩盖问题。该问题的其他答案提供了明确的解决方案。 - AdamExchange

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接