首页 > 解决方案 > 删除父记录时,还要删除猫鼬节点js中的参考记录|| 删除父记录时如何删除参考记录

问题描述

当我删除课程时,当然也会删除参考记录。

例如,我有 mca 课程,它的参考主题是 c、java、python,当我删除 mca 时,也会删除所有参考主题。

我怎样才能做到这一点。请帮忙

这是 Course.js

const mongoose = require('mongoose');
const Subject = require('./Subject');

const courseSchema = new mongoose.Schema({
    course_name: String,
    course_semester: Number
})

courseSchema.virtual('subjects', {
    ref: 'Subject',
    localField: '_id',
    foreignField: 'course_id'
})

// Delete subject when course is removed
courseSchema.pre('remove', async function (next) {
    const course = this
    await Subject.remove({ course_id: course._id })
    next()
})

const Course = mongoose.model('Course', courseSchema)

module.exports = Course

这是 Subject.js

const mongoose = require('mongoose');

const subjectSchema = new mongoose.Schema({
    subject_code: String,
    subject_name: String,
    subject_theory_marks: Number,
    subject_practicle_marks: Number,
    course_id: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Course'
    }
})

const Subject = mongoose.model('Subject', subjectSchema)

module.exports = Subject

courseRoute.js

router.get('/admin/delete-course/:id', adminAuthMiddleware,  
async (req, res) => {
    try {
        await Course.findByIdAndRemove(req.params.id, (err, doc) => {
            if (!err) {
                res.redirect('/admin/view-course');
            } else {
                res.send('Error in Course delete :' + err);
            }
        })
    } catch (err) {
        res.send(err);
    }
});

标签: node.jsdatabasemongodbmongoosemongoose-schema

解决方案


我找到了这个问题的解决方案。你需要在你的路线中调用 remove()

courseRoute.js

router.get('/admin/delete-course/:id', adminAuthMiddleware,  
async (req, res) => {
    try {
        await Course.findByIdAndRemove(req.params.id, (err, doc) => {
            if (!err) {
                doc.remove()  //here is the solution
                res.redirect('/admin/view-course');
            } else {
                res.send('Error in Course delete :' + err);
            }
        })
    } catch (err) {
        res.send(err);
    }
});

推荐阅读