如何在猫鼬中使用findById()用于嵌套数组?

时间:2019-05-13 15:48:03

标签: node.js mongoose

Error Image 实际上,我有一个对象,其中我有一系列的学期,每个学期都有一系列的科目,每个主题都有一系列的课。 我想在其各自的学期和科目中增加一课。 我使用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]
        })
})

1 个答案:

答案 0 :(得分:0)

我会像这样亲自构建我的模式:

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