更新作为创建另一个文档参考的文档。
我必须使用以下模式:教师和班级。 创建新班级时,我需要一位老师才能创建新班级,并且我的Teacher模式具有classes属性。现在,我已经可以创建一个新类了。 我的问题是我想更新用于创建新班级的老师,并将创建的班级存储到老师的classes属性中。
这是我的架构:
//类架构//
"a"
//教师模式//
"p"
//这是我用来创建新Class //
的控制器"l"
我希望有人能帮助我。预先谢谢你。
答案 0 :(得分:0)
我知道这不是您的特定问题的答案(有答案),但是我认为更大的问题是您的数据库设计。您将遇到每次创建类都必须更新两个集合的问题。如果要跟踪老师分配给的每个班级,则只需要使用班级集合即可。您无需为每个老师保留一系列班级。您只需要在创建的每个类中插入一个TeacherId。然后,当您需要知道老师开设的课程时,您可以查询该集合:
// class schema:
const mongoose = require('mongoose');
const classSchema = mongoose.Schema({
_id: mongoose.Schema.Types.ObjectId,
name: { type: String, required: true },
subject: { type: String, required: true },
teacher: {
type: mongoose.Schema.Types.ObjectId,
ref: 'Teacher',
required: true
},
students: []
});
module.exports = mongoose.model('Class', classSchema);
和教师收藏:
const mongoose = require('mongoose');
const teacherSchema = mongoose.Schema({
_id: mongoose.Schema.Types.ObjectId,
email: {
type: String,
required: true,
unique: true,
match: /[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/
},
password: { type: String, required: true },
// teacher doesn't need classes. all the info you need is in classes
// if you want to know what class a teacher teaches, just query classes
});
module.exports = mongoose.model('Teacher', teacherSchema);
最后(我改变了它的基本原理)
exports.create_class = (req, res, next) => {
const {teacherId, subject } = req.body
// query class collection for both teacher AND class
// you have to write this function findClassByTeacher
// to query Class collection for subject AND teacher
Class.findClassByTeacher({ teacherId, subject })
.then(class => {
if (!class) {
// if no class is found by this teacher create a new class
const _class = new Class({
_id: mongoose.Types.ObjectId(),
name: req.body.name,
subject: req.body.subject,
teacher: req.body.teacherId
});
return _class.save()
}
return undefined
})
.then(result => {
console.log(result);
// check for result === undefined (class already exists)
// return res 'class already exists'
res.status(201).json({
message: 'Class Created',
createdClass: {
_id: result._id,
name: result.name,
subject: result.subject,
teacher: result.teacher
},
req: {
type: 'GET',
url: 'http://localhost:3001/classes/' + result._id
}
});
})
.catch(err => {
console.log(err);
res.status(500).json({
error: err
});
});
}
这大部分未经测试,因此不要仅使用此代码。重要的是对模型进行建模的原理。您要使用一对多关系。例如,用户有很多帖子,帖子有很多评论,评论有很多喜欢,等等。您不必不必用NoSQL这样设计,您可以执行自己的操作(或者您可以尝试实现),但根据我的经验,这种方式更易于管理,尤其是对于长期扩展(如果您需要进行数据库迁移,对数据库进行复杂查询等)。
在您的情况下,老师和学生上许多课。您需要评估您的应用经常访问哪些数据,并以此为基础进行建模。
检查一下各种设计模式:https://docs.mongodb.com/manual/applications/data-models/
我会给您很好的阅读说明,并根据您的工作选择适合您收藏的最佳型号。