【问题标题】:When child document is deleted, how to delete its reference inside parent document in Mongoose?删除子文档时,如何在 Mongoose 中删除其在父文档中的引用?
【发布时间】:2019-03-15 01:00:58
【问题描述】:

在 Mongoose 中,我有一个包含子引用数组的父文档。

主题有很多主题:

Inside Subject.js:
const SubjectSchema = new Schema({   
  topics: [{
    type: Schema.Types.ObjectId,
    ref: 'topic'
  }]
...

当我删除一个主题时,我希望从 Subject.topics 数组中删除它的引用。

任何帮助将不胜感激!

【问题讨论】:

    标签: mongodb mongoose


    【解决方案1】:

    如果你有一个 id,也许这样的事情会起作用:

    Topics.findByIdAndRemove({ id }, (err) => {
        if(err)
            console.error(err);
    
        Subjects.update({ 
            "topics" : { $in : [id] } 
        }, { 
            $pullAll : { "topics" : [id] }
        } , (err, subject) => {
    
        })
    })
    

    【讨论】:

      【解决方案2】:

      我认为您应该为此使用 mongoose 中间件。 我所做的与你的问题完全相反。如果父文档被删除,那么我也想删除其引用的子文档。我在这里发布我的代码。希望对你有帮助。

      我有两个模型文件

      1. 房地产属性

      2. 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 的文档。

      【讨论】:

        猜你喜欢
        • 2020-01-31
        • 1970-01-01
        • 1970-01-01
        • 2015-03-27
        • 1970-01-01
        • 2021-02-10
        • 1970-01-01
        • 2019-07-16
        • 1970-01-01
        相关资源
        最近更新 更多