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

Posted

技术标签:

【中文标题】弃用警告:collection.findAndModify 已弃用。改用 findOneAndUpdate、findOneAndReplace 或 findOneAndDelete?【英文标题】:DeprecationWarning: collection.findAndModify is deprecated. Use findOneAndUpdate, findOneAndReplace or findOneAndDelete instead? 【发布时间】:2019-03-05 11:39:13 【问题描述】:

我正在使用猫鼬findOneAndUpdate,但仍然出现错误,

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

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

【问题讨论】:

你用的是哪个版本的猫鼬? @ShivamPandey 最新的 5.3.0 它最近刚刚发布。我会说他们应该在他们的版本中添加更改日志。 当我使用 findByIdAndUpdate 时出现该警告 参考:***.com/a/55980131/8350143 【参考方案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()。

【讨论】:

【参考方案2】:
  mongoose.set('useNewUrlParser', true);
  mongoose.set('useFindAndModify', false);
  mongoose.set('useCreateIndex', true);
  mongoose.set('useUnifiedTopology', true);

这些解决方案对我有用!

【讨论】:

【参考方案3】:

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); 

clickhere 检查相关的弃用情况

【讨论】:

【参考方案4】:
Mongoose.connect(Config.database,useUnifiedTopology: true,useNewUrlParser: true,useFindAndModify:false);

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

【讨论】:

【参考方案5】:

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

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

你可以这样使用它。

【讨论】:

【参考方案6】:

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

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

'useFindAndModify':默认为真。设置为 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 文档 (Click here) 中针对提到的这些弃用进行了更新:

Mongoose 的 findOneAndUpdate() 早于 MongoDB 驱动程序的 findOneAndUpdate() 函数,所以它使用 MongoDB 驱动程序的 findAndModify() 函数。

您可以通过三种或更多方式避免使用FindAndModify

    在全局级别:将选项设置为 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);

【讨论】:

【参考方案7】:

像这样全局更改 mongoose 配置:

mongoose.set('useFindAndModify', false);

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

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

您还可以管理提到的其他猫鼬弃用警告docs

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

就是这样。

【讨论】:

感谢这个解决方案,我使用了 new: true, useFindAndModify: false 这真的有效! - new: true, useFindAndModify: false【参考方案8】:

您也可以通过要求选项useNewUrlParser 在连接处传递选项。看下面->https://mongoosejs.com/docs/deprecations.html

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

【讨论】:

以上是关于弃用警告:collection.findAndModify 已弃用。改用 findOneAndUpdate、findOneAndReplace 或 findOneAndDelete?的主要内容,如果未能解决你的问题,请参考以下文章

警告 onRowClick 已弃用

TSlint 警告:弃用 atob 已弃用:请改用 `Buffer.from(data, 'base64')`

如何解决弃用警告“方法 to_hash 已弃用并将在 Rails 5.1 中删除”

使用 Mongoose 时的 MongoDB 弃用警告

CRT 弃用警告

修复弃用警告