我尝试了所有与使用 node.js 在 MongoDB 中删除引用文档相关的堆栈溢出解决方案。但他们中的大多数要么有不推荐使用的方法的解决方案,而且其中一些根本不起作用。
我有两个型号,Parent
和 Child
与 one-to-many
关系。父文档包括引用的子文档 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 ;
下一个文件有 children
型号为 childrenSchema.pre()
成功触发的中间件或钩子(Hook) -//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)
})
最佳答案
请注意,您正在尝试执行 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)
})
关于javascript - 使用 mongoose/MongoDB 中间件删除引用的文档(2021 年),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68987607/