为什么不删除挂钩与mongoose中的子文档一起使用?

时间:2018-03-02 18:37:13

标签: mongoose mongoose-schema

当我在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

它应该如何?如果是这样的话 - 我怎么能编写一个中间件,只要在主文档没有删除子文档时运行?

1 个答案:

答案 0 :(得分:1)

从技术上讲,永远不会删除子文档容器,因此不会触发挂钩。

来自Mongoose docs:

  

每个子文档都有自己的删除方法。对于数组子文档,这相当于在子文档上调用.pull()。对于单个嵌套子文档,remove()等效于将子文档设置为null。

Another post with the same issue

  

如何在主文档未删除子文档时编写运行的中间件?

可能的解决方法是完全避免使用子文档,并创建通过唯一键相关的单独模型。