(node:43032) DeprecationWarning: Mongoose: findOneAndUpdate() and findOneAndDelete() without the useFindAndModify option set to false are deprecated. See: https://mongoosejs.com/docs/deprecations.html#findandmodify (Use node --trace-deprecation ... to show where the warning was created)
(node:43032) DeprecationWarning: Mongoose: `findOneAndUpdate()` and `findOneAndDelete()` without the `useFindAndModify` option set to false are deprecated. See: https://mongoosejs.com/docs/deprecations.html#findandmodify
(Use `node --trace-deprecation ...` to show where the warning was created)
这个警告信息来自 Mongoose,指出 findOneAndUpdate()
和 findOneAndDelete()
方法在没有将 useFindAndModify
选项设置为 false
的情况下使用已被弃用。Mongoose 是 MongoDB 的一个对象数据建模 (ODM) 库,用于 Node.js。从 Mongoose 6.0 版本开始,这些方法在没有明确指定 useFindAndModify
选项的情况下将不再推荐使用。
原因
Mongoose 之所以做出这个改变,是因为 findAndModify
命令在 MongoDB 4.2+ 版本中已被标记为废弃,并且在未来的版本中可能会被完全移除。Mongoose 为了确保库的持续兼容性和用户代码的未来兼容性,决定在其库中先行弃用这些相关方法。
解决方法
要解决这个警告,你可以在调用 findOneAndUpdate()
或 findOneAndDelete()
方法时,显式地设置 useFindAndModify
选项为 false
。这会导致 Mongoose 使用 findOne()
加上 updateOne()
或 deleteOne()
的组合来替代原来的 findAndModify
命令。
示例代码
如果你之前的代码是这样的:
Model.findOneAndUpdate(
{ /* 查询条件 */ },
{ /* 更新内容 */ },
{ new: true }, // 确保返回更新后的文档
(err, doc) => {
// 处理结果
}
);
你应该修改为:
Model.findOneAndUpdate(
{ /* 查询条件 */ },
{ /* 更新内容 */ },
{ new: true, useFindAndModify: false }, // 添加 useFindAndModify: false
(err, doc) => {
// 处理结果
}
);
同样地,对于 findOneAndDelete()
,也需要添加 useFindAndModify: false
选项:
Model.findOneAndDelete(
{ /* 查询条件 */ },
{ useFindAndModify: false }, // 添加 useFindAndModify: false
(err, doc) => {
// 处理结果
}
);
注意
- 确保你的 Mongoose 版本是最新的,或者至少是支持
useFindAndModify
选项的版本。 - 测试你的更改以确保它们按预期工作,特别是在涉及事务或其他复杂操作的情况下。
通过上述修改,你可以消除弃用警告并确保你的代码与未来的 Mongoose 和 mongodb 版本兼容。
本文地址:https://www.tides.cn/p_mongoose-DeprecationWarning-Mongoose-findOneAndUpdate-and-findOneAndDelete-without-the-useFindAndModify-option-set-to-false-are-deprecated