MongoDB如何查询所有成绩全为A的学生文档?
如何查询MongoDB中所有成绩均为A的学生?
针对你提供的学生文档结构,要筛选出grades数组里所有子文档的grade字段均为'A'的学生,有两种实用的查询方式:
方法一:反向排除法(使用$not+$elemMatch)
通过排除存在非A成绩的文档,间接得到全A的学生:
db.students.find({ grades: { $not: { $elemMatch: { grade: { $ne: 'A' } } } } })
逻辑说明:$elemMatch: { grade: { $ne: 'A' } }会匹配数组中至少有一个成绩不是'A'的文档,加上$not后,就会筛选出所有没有非A成绩的学生,也就是全A的学生。
方法二:聚合管道验证法(使用$allElementsTrue+$map)
通过聚合管道对数组元素逐个验证,确保所有成绩都是'A':
db.students.aggregate([ { $match: { $expr: { $allElementsTrue: { $map: { input: "$grades", as: "g", in: { $eq: ["$$g.grade", "A"] } } } } } } ])
逻辑说明:$map会遍历grades数组,将每个子文档转换为布尔值(判断grade是否等于'A'),$allElementsTrue则验证所有布尔值均为true,只有满足条件的文档会被保留。
关于你之前尝试的问题说明
$all用于匹配数组包含指定所有元素的场景,不适合嵌套文档的条件判断;- 单独使用
$elemMatch: { grade: 'A' }只会匹配至少有一个A的文档,无法筛选全A的学生,因此需要用反向排除或聚合验证的方式实现需求。
内容的提问来源于stack exchange,提问作者ChocolateCyanide
相关产品推荐
相关产品推荐

