我正在使用mongoose的findOneAndUpdate
,但仍然遇到错误:
警告:collection.findAndModify已弃用。请改用findOneAndUpdate、findOneAndReplace或findOneAndDelete。
但我甚至没有使用findAndModify
,为什么它会将我的查询转换为findAndModify
?
我正在使用mongoose的findOneAndUpdate
,但仍然遇到错误:
警告:collection.findAndModify已弃用。请改用findOneAndUpdate、findOneAndReplace或findOneAndDelete。
但我甚至没有使用findAndModify
,为什么它会将我的查询转换为findAndModify
?
useFindAndModify
为 false
, 正如文档中所述。如果查看Mongoose定义文件,可以看到它调用了findAndModify更新命令。'useFindAndModify' 默认为 true。将其设置为 false,以便使findOneAndUpdate()和findOneAndRemove()使用原生的findOneAndUpdate()而非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
:
// 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});
像这样全局更改 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);
就是这样。
您还可以在连接时使用useNewUrlParser
选项传递要求选项。请参见以下内容 -> https://mongoosejs.com/docs/deprecations.html
mongoose.connect(config.MONGODB_URI, { useNewUrlParser: true, useFindAndModify: false});
您需要更改连接方法选项以消除错误:
mongoose.connect("mongodb://localhost/DB_Name", {
keepAlive: true,
useNewUrlParser: true,
useCreateIndex: true,
useFindAndModify: false
});
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);
点击此处查看相关废弃通知。
mongoose.set('useNewUrlParser', true);
mongoose.set('useFindAndModify', false);
mongoose.set('useCreateIndex', true);
mongoose.set('useUnifiedTopology', true);
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()。
Mongoose.connect(Config.database,{useUnifiedTopology: true,useNewUrlParser: true,useFindAndModify:false});
要跳过所有错误 :-) 在你的index.js或者其他命名的主js文件中加入这个。;-)
在 package.json 中将 mongoose 版本降级为 5X,然后运行 npm i 进行重新安装,最后运行 npm start。这样可以解决问题。
5.3.0
。 - Sudhanshu Gaur