我尝试了Stack Overflow上所有与使用node.js删除MongoDB中引用文档相关的解决方案,但其中大多数都使用已弃用的方法或根本不起作用。
我有两个模型:Parent
和Child
,它们之间是一对多
的关系。父文档包括一组引用的子文档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)
})