Как обновить документ, который является ссылкой для создания другого документа? - PullRequest
0 голосов
/ 31 января 2019

обновление документа, который является ссылкой для создания другого документа.

Мне нужны схемы: Учитель и Класс.когда я создаю новый класс, мне нужен учитель, чтобы я мог создать новый класс, и моя схема учителя имеет свойство классов.Прямо сейчас я могу создать новый класс.Моя проблема в том, что я хочу обновить учителя, который используется для создания нового класса, и сохранить созданный класс в свойстве классов учителя.

Вот мои схемы:

// КлассСхема //

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 },
        classes: [
            { 
              type: mongoose.Schema.Types.ObjectId, 
              ref: 'Class', 
            },
       ]
});

module.exports = mongoose.model('Teacher', teacherSchema);

// это мой контроллер для создания нового класса //

const mongoose = require('mongoose');

const Class = require('../models/class');
const Teacher = require('../models/teacher');

exports.create_class = (req, res, next) => {
    Teacher.findById(req.body.teacherId)
        .then(teacher => {
            if (!teacher) {
                return res.status(404).json({
                    message: 'Teacher not found'
                });
            }
            const _class = new Class({
                _id: mongoose.Types.ObjectId(),
                name: req.body.name,
                subject: req.body.subject,
                teacher: req.body.teacherId
            });
            return _class
                .save()

        })
        .then(result => {
            console.log(result);
            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
            });
        });
}

Надеюськто-то может мне помочь.заранее спасибо.

1 Ответ

0 голосов
/ 31 января 2019

Я знаю, что это не ответ на ваш конкретный вопрос (есть ответ), но я думаю, что большая проблема - это дизайн вашей базы данных.У вас возникнут проблемы с обновлением двух коллекций каждый раз, когда вы создаете класс.Если вы не хотите отслеживать каждый класс, к которому назначен учитель, вам просто нужно использовать коллекцию классов.Вам не нужно хранить массив классов для каждого учителя.Вам просто нужно вставить идентификатор учителя с каждым созданным классом.Затем вы запрашиваете эту коллекцию, когда вам нужно узнать, какие классы имеет учитель:

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

Я бы дал это хорошее прочтение и основываясь на том, чтоВы выбираете лучшую модель для своей коллекции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...