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