【问题标题】:Remove document with references Mongoose删除带有引用 Mongoose 的文档
【发布时间】:2021-07-26 00:56:02
【问题描述】:

删除调查模型中引用的调查时,我无法删除问题。调查被删除,但问题仍保留在数据库中。

调查模式:

let surveyModel = mongoose.Schema(
  {
    Title: String,
    Type: [String],
    Questions: { type: mongoose.Schema.Types.ObjectId, ref: "questions" },
    Answered: { type: Number, default: 0 }, // how many times users answered
    DateCreated: { type: Date, default: Date.now }, // date created
    Lifetime: { type: Date, default: Date.now }, // Survey expiry
    User: { type: mongoose.Schema.Types.ObjectId, ref: "users" }
  },
  {
    collection: "surveys",
  }
);

问题架构:

let questionModel = mongoose.Schema(
  {
    MC: {
      QuestionText: String,
      Options: [String],
    },
    TF: {
      QuestionText: String,
      Options: Boolean,
    }
  },
  {
    collection: "questions",
  }
);

module.exports = mongoose.model("Question", questionModel);

我现在拥有的代码:

// process survey delete
module.exports.processDeletion = (req, res, next) => {
  let id = req.params.id;
  
  Survey.remove({ _id: id }, (err) => {
    Question.remove({_id: { $in: req.body.Questions }}, (err, res) => {
      if (err) {
        console.log(err);
        res.end(err);
      }
    });
    if (err) {
      console.log(err);
      res.end(err);
    } else {
      // refresh survey list
      res.redirect("/live-surveys");
    }
  });
};

【问题讨论】:

    标签: javascript mongodb express mongoose


    【解决方案1】:

    您的第一步应该是删除孩子,即问题。

    注意:我认为“问题”应该大于 1,那么它必须是调查模型中的参考数组。但是,对于此示例,它将按照您的设置进行。

    那么,你的删除路线,可能是这样的:

    router.delete("/delete/:surveyById", deleteSurvey");
    router.param("surveyById", surveyId"); //This one is your middleware
    
    //surveyController.js
    
    const Survey = require("../models/Survey");
    const Question = require("../models/Question");
    
    exports.surveyId = (req, res, next, id) => {
      Survey.findById(id).exec((err, data) => {
        if(!data || err) return res.status(400).json({error: "Survey not found")};
        else {
          req.survey = data;
          next();
        }
      )};
    };
    
    exports.deleteSurvey = (req, res) => {
      Questions.findByIdAndRemove(req.survey.Questions) //Here your Questions Id
      .exec((err, data)) => {
        if(err) return res.status(400).json({error: "Error to delete questions"});
        Survey.findByIdAndRemove(req.survey._id).exec((err, data) => {
          if(err) return res.status(400).json({error: "Error to delete Survey"});
        return res.json({ message: "Deleted")};
        });
      });
    };
    

    如果您愿意,您也可以使用 async await,这也是一样的,您可以更好地控制您的代码。

    【讨论】:

      猜你喜欢
      • 2020-01-31
      • 2019-06-05
      • 1970-01-01
      • 2014-05-01
      • 1970-01-01
      • 2018-04-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多