You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MongoDB的$filter中使用多条件?筛选达标科目≥2的学生

如何用MongoDB的$filter实现多条件筛选,找出至少两门科目分数高于特定值的学生?

先看你给出的学生数据结构,每个学生的marks字段是一个包含单个科目分数对象的数组。要实现你的需求,我们可以通过聚合管道结合$filter来统计符合条件的科目数量,再筛选出达标学生。下面是具体的实现步骤和代码:

示例实现(假设特定分数阈值为80)

db.students.aggregate([
  // 第一步:将marks里的科目分数对象转为键值对数组,方便遍历统计
  {
    $addFields: {
      subjectMarks: { $objectToArray: { $first: "$marks" } }
    }
  },
  // 第二步:用$filter筛选出分数高于阈值的科目,再统计数量
  {
    $addFields: {
      eligibleSubjectCount: {
        $size: {
          $filter: {
            input: "$subjectMarks",
            cond: { $gt: ["$$this.v", 80] } // 这里的80就是你要设置的特定分数值
          }
        }
      }
    }
  },
  // 第三步:只保留至少有2门科目达标的学生
  {
    $match: { eligibleSubjectCount: { $gte: 2 } }
  },
  // 可选:移除临时字段,还原原始数据结构
  {
    $project: { subjectMarks: 0, eligibleSubjectCount: 0 }
  }
])

代码解释

  • 第一步转换结构:因为你的marks是单元素数组,先用$first取出里面的科目分数对象,再用$objectToArray把它转成{k: 科目名称, v: 分数}的数组格式——这样我们才能用$filter遍历每个科目进行判断。
  • 第二步用$filter统计达标科目数:$filter会遍历subjectMarks数组,只保留分数($$this.v)大于阈值的元素;再用$size获取这个筛选后数组的长度,也就是该学生达标的科目数量。
  • 第三步筛选达标学生:通过$match只保留eligibleSubjectCount≥2的学生。
  • 最后清理临时字段:如果不需要我们新增的临时统计字段,用$project移除它们,返回和原始数据一致的结构。

如何在$filter中使用多条件?

如果你的需求更复杂,比如要同时满足「分数高于80」和「不是Hindi科目」这样的多条件,只需要把cond改成$and组合多个判断即可:

$filter: {
  input: "$subjectMarks",
  cond: {
    $and: [
      { $gt: ["$$this.v", 80] },
      { $ne: ["$$this.k", "Hindi"] }
    ]
  }
}

你也可以用$or来实现「满足任一条件」的筛选,根据实际需求灵活组合即可。

测试结果示例

如果阈值设为80,运行上面的聚合后,只会返回Pawan的信息(他4门科目分数都超过80);如果把阈值降到75,Kartik也会被筛选出来(Maths77、Hindi80、Sci79都超过75,共3门)。

内容的提问来源于stack exchange,提问作者p_k

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:07:28