弃用警告: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?的主要内容,如果未能解决你的问题,请参考以下文章
TSlint 警告:弃用 atob 已弃用:请改用 `Buffer.from(data, 'base64')`