我认为您应该为此使用 mongoose 中间件。
我所做的与你的问题完全相反。如果父文档被删除,那么我也想删除其引用的子文档。我在这里发布我的代码。希望对你有帮助。
我有两个模型文件
房地产属性
RealEstateProject(父)
房地产属性:
var RealEstatePropertySchema = new Schema({
Type : { type : String, enum : ['2BHK','3BHK','1BHK','3.5BHK','4BHK','5BHK','1RK','1.5BHK','2.5BHK','4.5BHK','5.5BHK','Penthouse','Plot'], required : true },
Area : { type : String, required: true },
Price : { type : Number, required: true },
NumberOfUnits : { type : Number, required: true },
Gallery : [{ type : String, required: false }],
PricePerSquareFoot : { type : Number, required: true },
CreateDate : { type : Date, required: false },
UpdateDate : { type : Date, required: false, default: Date.now },
Project : { type : mongoose.Schema.Types.ObjectId, ref:'RealEstateProject', required : true},
Status : { type : String, enum : ['Under Construction', 'Ready to move'],required : false }
});
房地产项目(父):
var RealEstateProjectSchema = new Schema({
Name : { type : String, required: true },
Description : { type : String, required: true },
DetailAddress : { type : String, required: true },
ShortAddress : { type : String, required: true },
Area : { type : Number, required: true },
City : { type : String, required: true },
Pincode : { type : Number, required: true },
CreateDate : { type : Date, required: false },
UpdateDate : { type : Date, required: false, default : Date.now() },
IsActive : { type : Boolean, required: false },
Amenities: [{ type : String, required : true }],
Possession: { type : String, required : true },
ProjectType: { type : String, enum : ['Apartment', 'Land', 'Bungalow', 'Row House', 'Villas'], required : true },
});
//mongoose middleware to remove reference docs
RealEstateProjectSchema.pre('remove',function(next){
console.log("Removing property of project " + this._id);
//code to remove RealEstateProperties reference by RealEstateProject
//Note : Here you can use $unset to clear the refernce
this.model('RealEstateProperty').find({ Project : this._id }, function(err,properties){
if(err){
console.log("No property found in this project");
}else if(properties.length == 0){
console.log("No property found in this project");
}else{
for (var i=0; i<properties.length; i++){
properties[i].remove(function(delete_err,delete_data){
if(delete_err){
console.log("No property found in this project");
}else{
console.log("Properties deleted");
}
});
}
}
});
next();
});
当 RealEstateProject 被移除时
RealEstateProject.findOne({ id : req.body.id })
.exec(function(err,project){
if(err){
console.log(err);
res.json(err);
} else{
if(!project){
console.log("Project not found");
res.json({error:"Project not found, invalid Project id"});
}else{
project.remove(function(delete_project_err,delete_project_data){
if(delete_project_err){
console.log(delete_project_err);
res.json(delete_project_err);
}else{
console.log("Project removed successfully");
res.json({result:1});
}
});
}
}
});
在“删除”时,调用中间件并删除 RealEstateProperty 中具有相同参考 ID 的文档。