node.js - 如何将 findById() 用于猫鼬中的嵌套数组?
问题描述
错误图像实际上我有一个对象,其中我有一系列学期,每个学期都有一系列科目,每个科目都有一系列课程。我想在其各自的学期和科目中添加课程。我使用 findById 从 Object 中查找相应的学期,但是当我再次使用 findById 从 subj 的数组中查找特定主题时。它给了我错误。
Semester.findById(req.body.semesterId).populate({ path: 'subjects' })
.exec((err, model) => {
[model.subjects.findById(req.body.subjectId, (err, model) => {
console.log(model)
})][1]
})
})
解决方案
我个人会像这样构建我的架构:
const semesterSchema = mongoose.Schema({
number: { type: Number, required: true },
subjects: [{ type: mongoose.SchemaTypes.ObjectId, ref: 'Subject' }]
})
const subjectSchema = mongoose.Schema({
semester: { type: mongoose.SchemaTypes.ObjectId, ref: 'Semester', required: true },
title: { type: String },
lessons: [{ type: mongoose.SchemaTypes.ObjectId, ref: 'Lesson' }]
})
const lessonSchema = mongoose.Schema({
semester: { type: mongoose.SchemaTypes.ObjectId, ref: 'Semester', required: true },
subject: { type: mongoose.SchemaTypes.ObjectId, ref: 'Subject', required: true },
title: { type: String },
test: { type: Object }
})
它的作用是提供对我的模式的循环引用,这在某些情况下非常好。
为了解决您描述的情况,我们可以这样做:
const { semesterId, subjectId } = req.body; // destructure variables needed from body
Semester
.findById(semesterId)
.populate({ path: 'subjects' })
.lean() // use lean() if you only require the document and not the entire mongoose object. i.e. you do not require .save(), .update(), etc methods.
.exec((err, semester) => {
const subject = semester.subjects.find(subject => subject._id === subjectId );
console.log(subject);
});
// ****** THIS ASSUMES YOU HAVE FOLLOWED MY DEFINED SCHEMA ABOVE ********
或者,如果您想要这样的数据,您可以直接查询主题并填充学期:
const { semesterId, subjectId } = req.body;
Subject
.findById(subjectId)
.populate({ path: 'semester' })
.lean()
.exec((err, subject) => {
console.log(subject);
});
// ****** THIS ASSUMES YOU HAVE FOLLOWED MY DEFINED SCHEMA ABOVE ********
推荐阅读
- python - 关于数据框中的空白行
- javascript - Three.js GLTF 导出中的破损纹理
- ios - SwiftUI 可以将 ObservableObject 放在另一个 ObservableObject 中吗?
- mongodb - 在嵌套字段上添加哈希索引会在 Mongodb 中产生 0 个匹配项
- linux - 在 bash sh 脚本中打开 shell
- reactjs - 从 react-select 设置 Select 元素的样式
- javascript - Vue.js 中的电子邮件验证
- php - 功能测试中的夹具对象引用不正确
- c++ - 无法接收无效电子邮件
- c++ - 按人员编号快速排序一组人员