Search code examples
node.jsdatabasemongodbmongoosemongoose-schema

When deleting parent record then also delete reference record in mongoose node js || How can i delete reference record when deleting parent record


When i delete course then also delete the reference records of course.

For example i have mca course and it's reference subject is c, java, python when i delete mca also delete the all the reference subject.

How can i do this. Please help

Here is 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

Here is 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);
    }
});

Solution

  • I found solution of this problem. you need to call remove() in your route

    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);
        }
    });