数据关联
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: {} })
});