(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教程 发布时间:2024-11-01
(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