数据关联
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对应的模型的_idforeignField: "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的virtualconst 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里面设置的关联就是mscamppath: "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))}// 直接调用设置的前置钩子里面设置的removemscamp.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))}// 直接调用设置的前置钩子里面设置的removecourse.remove()res.status(200).json({ success: true, data: {} })
});