当我在mongoose中有一个带有嵌套模式的模式时,就像这样
const Sub = Schema({
foobar: String,
})
Sub.pre('remove', function(next) { ... next() })
const Main = Schema({
foo: String,
bar: [Sub],
})
Main.pre('remove', function(next) { ... next() })
当我删除Main
文档时,将删除主要文档和子文档中的remove-middleware get。
但是当我只是删除一个子文档时,没有删除了一个remove-hook的调用。例如:
const main = await new Main({
foo: 'test',
bar: [{
foobar: 'test'
}),
}).save()
await main.bar[0].remove() // or bar.pull()
// pre/post remove hooks on Subdocument not called
它应该如何?如果是这样的话 - 我怎么能编写一个中间件,只要在主文档没有删除子文档时运行?
答案 0 :(得分:1)
从技术上讲,永远不会删除子文档容器,因此不会触发挂钩。
来自Mongoose docs:
每个子文档都有自己的删除方法。对于数组子文档,这相当于在子文档上调用.pull()。对于单个嵌套子文档,remove()等效于将子文档设置为null。
Another post with the same issue
如何在主文档未删除子文档时编写运行的中间件?
可能的解决方法是完全避免使用子文档,并创建通过唯一键相关的单独模型。