【 Node】MongoDb的集合关联与删除

这篇博客详细介绍了在MongoDB中如何实现数据模型之间的关联,包括使用虚拟字段进行数据关联、数据导入顺序以及查询操作。同时,还探讨了如何配置前置钩子以实现关联删除,确保当删除一个数据模型时,与其关联的其他数据也会被同步删除。这为数据库管理和数据一致性提供了实用的方法。
摘要由CSDN通过智能技术生成

数据关联

course数据关联了mscamp数据 实现数据关联展示
后导入的数据course 先导入的数据mscamps
在这里插入图片描述

创建数据模型

Mscamp.js

// 创建数据模型
const mongoose = require("mongoose");
const MscampSchema = new mongoose.Schema(
    {
        name: {
            type: String,
            required: [true, "请填写培训课程的名字"],
            unique: true,
            trim: true,
            maxlength: [50, "课程名字不能超过50个字"],
        }
        // 定义的数据模型规则
        。。。。。。
    },
    // 数据关联
    {
        toJSON: { virtuals: true },
        toObject: { virtuals: true }
    }
);
// 配置virtuals 
MscampSchema.virtual('courses', {
    ref: "Course",// 关联的模型
    localField: "_id", // 内键,schema对应的模型的_id
    foreignField: "mscamp", //外键,关联模型Course的mscamp字段
    justOne: false // 只查询一条数据
})
// 下方Course的ref绑定的是这里设置的Mscamps
module.exports = mongoose.model('Mscamp', MscampSchema)

Courses.js

const mongoose = require("mongoose");
const CourseSchema = new mongoose.Schema({
    title: {
        type: String,
        trim: true,
        required: [true, "请添加课程名称"],
    },
    mscamp: {
    	// 集合关联 与mscamp集合关联
        type: mongoose.Schema.ObjectId,
        // ref绑定的是 mongoose.model("<name>", xxxSchema);
        ref: "Mscamp",
        required: true,
    }
});
module.exports = mongoose.model("Course", CourseSchema);

引入数据模型

mscamps.js

const Mscamp = require('../models/Mscamp.js')
exports.getMscamps = async (req,res,next)=>{
	  // 查询所有数据 并且与courses进行关联
	  // 基本配置查看上方的Mscamps的virtual
	  const mscamps = await Mscamp.find().populate('courses')
}

courses.js

const Course = require('../models/Course.js')
exports.getCourses = async (req,res,next)=>{
	  // 查询所有数据 并且与courses进行关联
	  // 后导入的数据直接populate 就可以进行数据关联
	  const couse= await  Course.find().populate({
	  		// 设置关联路径 course.json里面设置的关联就是mscamp
            path: "mscamp",
            // 根据设置的查询条件 只展示设置的数据
            select: "name description"
        })
      const couse= await  Course.find().populate('mscamp')
}

关联删除

const mongoose = require("mongoose");

const MscampSchema = new mongoose.Schema(
	{
		// 类型设置
	},
	 // 数据关联
    {
        toJSON: { virtuals: true },
        toObject: { virtuals: true }
    }
)

// 配置virtuals 
MscampSchema.virtual('courses', {
    ref: "Course",
    localField: "_id",
    foreignField: "mscamp",
    justOne: false
})

// 在Mscamps 配置数据模型处设置 (course下的类型设置了ref与Mscamps进行了数据关联)
// 配置前置钩子 连带删除(当触发删除时 会将mscamp和course关联的一起删除)
MscampSchema.pre('remove', async function (next) {
    // 当根据ID删除mscamp中的数据时 连带删除course里面的课程
    await this.model('Course').deleteMany({ mscamp: this._id })
    next()
})

module.exports = mongoose.model('Mscamp', MscampSchema)

执行删除操作

exports.deleteMscamp = asyncHandler(async (req, res, next) => {
    const mscamp = await Mscamp.findById(req.params.id)
    if (!mscamp) {
        return next(new ErrorResponse(`Resource not foun with id of ${req.params.id}`, 404))
    }
    // 直接调用设置的前置钩子里面设置的remove
    mscamp.remove()
    res.status(200).json({ success: true, data: {} })
})

exports.deleteCourse = asyncHandler(async (req, res, next) => {
    const course = await Course.findById(req.params.id)
    if (!course) {
        return next(new ErrorResponse(`Resource not foun with id of ${req.params.id}`, 404))
    }
      // 直接调用设置的前置钩子里面设置的remove
    course.remove()
    res.status(200).json({ success: true, data: {} })
});
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值