MongoDB数组查询问题:匹配数组元素无结果求助
嘿,这个问题我之前帮朋友排查过,其实是MongoDB对子文档匹配的规则搞的鬼!让我给你掰扯清楚:
为什么你的查询没结果?
你用db.cardsets.find({vocab:{foreign:"el gato"}})的时候,MongoDB会把你传入的{foreign:"el gato"}当成完整的子文档模板去匹配。也就是说,它会在vocab数组里找一个完全和这个模板一模一样的元素——但你的实际子文档是同时包含english和foreign两个字段的,少了english字段的话,结构不匹配,自然查不到结果。
举个反例,如果你这么写:
db.cardsets.find({vocab:{english:"the cat", foreign:"el gato"}})
反而能查到目标文档,因为这是完全匹配了子文档的所有字段和内容。
正确的查询方式
有两种实用的方法可以解决这个问题:
点符号直接定位子字段:这是最常用的单条件查询方式,直接通过
数组字段.子字段的路径来匹配:db.cardsets.find({"vocab.foreign": "el gato"})它会遍历
vocab数组里的每一个元素,只要有一个元素的foreign字段等于"el gato",就会返回整个文档。用
$elemMatch操作符:如果需要同时匹配子文档的多个字段(比如既要foreign是"el gato",又要english是"the cat"),用这个操作符会更清晰:db.cardsets.find({vocab: {$elemMatch: {foreign: "el gato"}}})单条件查询也能用它,不过点符号会更简洁一些。
内容的提问来源于stack exchange,提问作者Will Lehman
相关产品推荐
相关产品推荐

