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

新手上路,请多包涵

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

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

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

原文由 Sudhanshu Gaur 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 609
2 个回答

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

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

‘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 文档( 单击此处)中更新了提到的这些弃用:

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

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

  1. 在全局级别:将选项设置为 false。
 // Make Mongoose use `findOneAndUpdate()`. Note that this option is `true`
// by default, you need to set it to false.
mongoose.set('useFindAndModify', false);

  1. 在连接级别:我们可以使用连接选项进行配置:
     mongoose.connect(uri, { useFindAndModify: false });

  1. 在查询级别:
    await ModelName.findOneAndUpdate({matchQuery},
   {$set: updateData}, {useFindAndModify: false});

原文由 Shivam Pandey 发布,翻译遵循 CC BY-SA 4.0 许可协议

像这样全局更改猫鼬配置:

 mongoose.set('useFindAndModify', false);

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

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

您还可以管理其他猫鼬弃用警告作为提及 文档

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

而已。

原文由 Ikram - Ud - Daula 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题