MongoDB查询问题:分数<70且类型为exam的查询无结果求助
解决MongoDB数组嵌套文档查询无结果的问题
嘿,我来帮你搞定这个查询问题!你遇到的情况其实是MongoDB数组匹配的常见误区——你的原查询写法是在找整个scores数组完全等于你指定的单元素数组的文档,但你的示例文档里scores有3个元素,自然匹配不到任何结果。
为什么原查询不行?
原查询语句:
db.students.find({"scores":[{"score":{$lt:70},"type":"exam"}]}).pretty()
这种写法是精确匹配整个数组的内容和结构,只有当某个文档的scores数组恰好只有一个元素,且这个元素完全符合{"score":{$lt:70},"type":"exam"}时才会被返回,显然和你的数据结构不符。
正确的两种查询方式
根据你的需求(找数组中至少有一个元素同时满足score<70和type="exam"的文档),推荐以下两种写法:
1. 使用$elemMatch(最精准,推荐)
$elemMatch专门用于匹配数组中单个元素同时满足多个条件的场景,完全符合你的需求:
db.students.find({"scores": {$elemMatch: {"score": {$lt: 70}, "type": "exam"}}}).pretty()
这个查询会准确找到所有scores数组里存在至少一个元素,同时满足分数小于70且类型为exam的文档,你的示例文档会被正确返回。
2. 使用点符号(注意适用场景)
如果你的需求不需要严格保证两个条件属于同一个数组元素(虽然你这里需要),也可以用点符号写法:
db.students.find({"scores.score": {$lt: 70}, "scores.type": "exam"}).pretty()
但要注意:这种写法会匹配那些scores数组里有一个元素分数小于70,同时另一个元素类型为exam的文档,如果你只想要同一个元素满足两个条件,还是用$elemMatch更稳妥。
验证结果
用$elemMatch的查询语句运行后,你的示例文档会被正确返回,因为它的scores数组里确实存在一个元素满足score=1.463...<70且type="exam"的条件。
内容的提问来源于stack exchange,提问作者studentneedshelp
相关产品推荐
相关产品推荐

