如何更新作为创建另一个文档参考的文档?

时间:2019-01-31 06:02:44

标签: node.js mongodb express mongoose

更新作为创建另一个文档参考的文档。

我必须使用以下模式:教师和班级。 创建新班级时,我需要一位老师才能创建新班级,并且我的Teacher模式具有classes属性。现在,我已经可以创建一个新类了。 我的问题是我想更新用于创建新班级的老师,并将创建的班级存储到老师的classes属性中。

这是我的架构:

//类架构//

"a"

//教师模式//

"p"

//这是我用来创建新Class //

的控制器
"l"

我希望有人能帮助我。预先谢谢你。

1 个答案:

答案 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/

我会给您很好的阅读说明,并根据您的工作选择适合您收藏的最佳型号。