使用 Mongoose/MongoDB 中间件删除引用文档(2021 年)。

7

我尝试了Stack Overflow上所有与使用node.js删除MongoDB中引用文档相关的解决方案,但其中大多数都使用已弃用的方法或根本不起作用。

我有两个模型:ParentChild,它们之间是一对多的关系。父文档包括一组引用的子文档ID数组,如下所示:

//file => parent.js 

const parentSchema = new mongoose.Schema({
  parentName: {
    type: String,
  },
  childrens : [
    {
      type: mongoose.Schema.Types.ObjectId,
      ref: 'Children'
    }
  ]
});

const Parent = mongoose.model("Parent", parentSchema);
module.exports = Parent ; 


下一个文件有一个具有 childrenSchema.pre() 中间件或钩子的 children 模型,该中间件或钩子已成功触发。
//file => children.js 

const mongoose = require("mongoose");
const Parent  = require("./parent"); 


const childrenSchema = new mongoose.Schema({
  childrenId: Number,
  info: String,
  type: String, 
});


childrenSchema.pre('findOneAndDelete', async function(next) {
  console.log('trigger when middleware runs' , this.getQuery()["_id"]) ; 

  const childrenId = new mongoose.Types.ObjectId(this.getQuery()["_id"])
  await Parent.updateOne({} , { $pull: { childrens: { _id: childrenId }}});
  next()
}) 


const Children = mongoose.model("Children", childrenSchema);
module.exports = Children ; 

现在,最后这就是我调用删除childrenId实例的路由。 我遇到了很多错误,但主要是上面文件中说Parent.updateOne()不是一个函数。但是在执行下面的路由时,中间件会成功触发。

// route which performs delete action and triggers mongoose middleware

router.delete('/delete/instance' , async(req,res) => {
  const childrenId = new mongoose.Types.ObjectId('612cd0d8f9553c9f243db691')
  
  const deletedInstance = await Children.findOneAndDelete(
      { _id: childrenId}
  )
  res.json(deletedInstance)

})
1个回答

0
请注意,您正在尝试使用没有筛选选项的updateOne()进行操作。对于逻辑本身,为什么不将其放在路由器内部呢?
const Parent  = require("./parent"); 

router.delete('/delete/instance' , async (req,res) => {
  await Parent.updateOne({ childrens: '612cd0d8f9553c9f243db691' }, { $pull: { childrens: '612cd0d8f9553c9f243db691' }})
  const deletedInstance = await Children.findOneAndDelete({ _id: '612cd0d8f9553c9f243db691'})
  res.json(deletedInstance)
})

我知道这个解决方案并且它是有效的。然而,我想要了解和使用中间件钩子使得我可以将清理孤立引用项的逻辑保持在控制器/路由之外。感谢你的建议。 - relu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接