Правильное использование отношений mongoose
Есть две модели: Student и Grade (приведу их код ниже). Я делаю своё API и у меня есть POST запрос /api/student/find, который в body получает id студента. Я не могу правильно оформить ответ. Мне нужно получить ответ вида
"student": {
"date": "2020-11-12T10:25:02.237Z",
"visits": [],
"_id": "5fad0da3cbcbd02a1599a8f7",
"name": "Владимир Владимирович",
"grade": {
"students": [
"5fad10691a55c62d7ef45fbd"
],
"_id": "5fad0b5e56f75f26c4d7fcbe",
"title": "5Б",
"createdAt": "2020-11-12T10:15:58.467Z",
"updatedAt": "2020-11-12T10:37:29.320Z",
"__v": 1
},
"createdAt": "2020-11-12T10:25:39.949Z",
"updatedAt": "2020-11-12T10:25:39.949Z",
"__v": 0
}
Я делаю это так:
const [student] = await Student.findById(id);
if (!student) {
return res.json({
status: 401,
success: false,
message: "Профиль не найден"
});
}
const grade = await Grade.findById(student.grade);
student.grade = grade;
Но в документации нашел метод populate и пробую делать так (только почему-то получаю undefined, а если делаю console.log внутри callback'а, то всё отлично):
const grade = await Student.findById(id).populate('grade').exec(function (err: any, student: any) {
return student.grade;
});
Как всё таки правильно работать с отношениями? Если же через populate, то как мне сделать так, чтобы undefined я не получал?
Student:
const mongoose = require('mongoose');
const StudentSchema = new mongoose.Schema(
{
name: {
type: String,
maxlength: 40,
minlength: 1,
required: true
},
date: {
type: Date,
default: new Date(),
required: true
},
grade: {
type: mongoose.Types.ObjectId,
ref: "Grade"
},
visits: [{
type: mongoose.Types.ObjectId,
ref: "Visit"
}]
},
{
timestamps: true
});
const Student = mongoose.model('Student', StudentSchema);
export default Student;
Grade:
const mongoose = require('mongoose');
const GradeSchema = new mongoose.Schema(
{
title: {
type: String,
maxlength: 10,
minlength: 1,
required: true
},
teacher: {
type: mongoose.Types.ObjectId,
ref: "Teacher"
},
students: [{
type: mongoose.Types.ObjectId,
ref: "Student"
}],
},
{
timestamps: true
});
const Grade = mongoose.model('Grade', GradeSchema);
export default Grade;
Ответы (1 шт):
Автор решения: Alexander Chernykh
→ Ссылка
await Student.findById(id)
.populate("grade")
.exec(function (err: Error, student: mongosee.Document) {
if (!student) {
return res.json({
status: 401,
success: false,
message: "Профиль не найден",
});
}
return res.json({
status: 200,
success: true,
student,
});
});
};