node.js - 猫鼬:中间件预删除一个选项不起作用
问题描述
猫鼬的文档说:
Schema.prototype.pre():
参数:
«String|RegExp» 方法名称或正则表达式匹配方法名称
[options] «Object»
[options.document] «Boolean» 如果 name 是文档和查询中间件的挂钩,设置为 true 以在文档中间件上运行。
[options.query] «Boolean» 如果 name 是文档和查询中间件的挂钩,则设置为 true 以在查询中间件上运行。
回调«功能»
还有关于 pre hook "deleteOne":
Mongoose - middleware
以下文档功能支持文档中间件。在文档中间件函数中,this 指的是文档:
...deleteOne以下模型和查询函数支持查询中间件。在查询中间件 >functions 中,this 指的是查询:
...deleteOne
所以,deleteOne 在 Document 和 Query 钩子中,现在让我们尝试使用它:
mySchema.pre('deleteOne', { document: true }, function(next) {
console.log(this)
next()
})
结果:这是指查询,而不是文档。为什么?
解决方案
哦,从文档中不清楚,'this' 仅指文档#deleteOne 中的文档。
所以,'deleteOne' 钩子的正确用法是:
在模型中:
DocSchema.pre('deleteOne', { document: true }, function(next) {
console.log(this)
next()
})
稍后在代码中(在控制器等中):
const doc = await DocModel.findOne({ name: 'myDoc' })
await doc.deleteOne()
现在'this'指的是文档
推荐阅读
- javascript - Mapbox 在点击事件上更改缩放
- tfs - 使用 TFS 计划备份/还原将 TFS 2015 数据库还原到 TFS 2018 失败
- dojo - 在 XPages 中设置 Dojo 时间选择器的开始时间和结束时间
- elasticsearch - ElasticSearch/Kibana:时区从 UTC 更改为东部
- sql - PARTITION BY 表达式引用既不分组也不聚合的列 sku
- c# - 无法检查两个时间字段中是否存在时间(MySQL、C#、windowsform 应用程序)
- c# - 如何使用打开的 XML Selenium C# 使用列名和行号获取单元格值
- vim - Vim 自动读取而不改变光标位置
- php - 多维 PHP 数组按第一个数组的值分组
- html - CSS 网格不适用于 IE 或 Edge