【问题标题】:Filter nested populated array过滤嵌套填充数组
【发布时间】:2021-06-06 10:54:08
【问题描述】:

假设我有一个如下所示的教室:

{
    courseName: String,
    teacher: ObjectId,
    students: [{type: ObjectId, ref: 'Student'}]
}

“学生”模式如下所示:

{
    personalInfo: PersonalInfo,
    proffesionalInfo: {type: ObjectId, ref: 'ProffesionalInfo'}
}

“ProffesionalInfo”架构如下所示:

{
    allgrades: [Number],
    averageGrade: Number,
    ...
    ...
}

我有教室 _id,我只想让学生的平均分低于 90。 我现在的做法是这样的:

Classroom.findOne({ _id })
        .populate("teacher", "_id name")
        .populate({
            path: 'ridesstudents',
            select: 'proffesionalInfo',
            populate: [
                {
                    path: "proffesionalInfo",
                    select: "allgrades averageGrade"
                }
            ]
        })
        .then(classroom => {
            classroom.students = classroom.students.filter(student => student.proffesionalInfo.averageGrade < 90);
            resolve(user);
        })
        .catch(err => reject(err));

如您所见,我在带完所有学生后进行过滤。 如果我有 1000 万学生,而只有 2 个学生的成绩低于 90 这是“不好”的方法。

如何过滤查询中的学生,而不是把所有学生都带进来然后过滤??

旁注 - 上面的数据只是一个例子,目标是带来总体思路。不详述。

【问题讨论】:

    标签: node.js mongoose mongodb-query mongoose-populate


    【解决方案1】:

    尝试使用聚合:

    let classroom = Classroom.aggregate([
       { $match: { _id: classroomId } },
       { $lookup: {
            from: "students",
            localField: "_id",
            foreignField: "students",
            pipeline:[
              { $lookup: {
                   from: "professionalInfo",
                   localField: "_id",
                   foreignField: "proffesionalInfo",
                   as:"professionalInfo"
              }},
              { $match: {$lte: ["professionalInfo.averageGrade",90]}}
            ]
            as: "students"
     }}])
    

    【讨论】:

      猜你喜欢
      • 2021-07-24
      • 2021-11-07
      • 2015-03-26
      • 2020-06-07
      • 2018-07-05
      • 2021-01-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多