MongoDB如何查询嵌套数组满足多条件的文档
正确的MongoDB查询方式
你的问题出在对数组嵌入文档的匹配逻辑理解上,原来的查询语句有两个关键错误:一是字段名写错(应该是subwords而不是subword),二是直接匹配整个嵌入对象的方式无法满足"同一个数组元素同时满足多个条件"的需求。
要实现你想要的查询——找到username为"user_1",且words数组中存在同一个元素同时满足word是"RATIONAL"、subwords包含"RAT"的文档,你需要使用$elemMatch操作符,它专门用于指定数组中单个元素需要满足的多个查询条件。
正确的查询语句
db.users.find( { "username": "user_1", "words": { "$elemMatch": { "word": "RATIONAL", "subwords": "RAT" } } } ).pretty();
为什么原来的查询不生效?
你原来的写法:
db.users.find({username:"user_1","words":{word:"RATIONAL",subword:"RAT"}}).pretty();
会让MongoDB尝试匹配words数组中存在一个完全等于{word:"RATIONAL",subword:"RAT"}的元素,但你的文档中:
- 字段名是
subwords(复数)而非subword; subwords是数组类型,不是单个字符串;- 即使字段名正确,这种写法要求该元素只能有
word和subwords这两个字段且值完全匹配,而你的文档中元素结构是包含word和subwords数组的对象,所以无法匹配。
而$elemMatch会告诉MongoDB:在words数组中找一个元素,它的word字段等于"RATIONAL",并且它的subwords数组包含"RAT"(MongoDB默认会检查数组是否包含指定值,无需额外操作符)。
内容的提问来源于stack exchange,提问作者Tal Levi
相关产品推荐
相关产品推荐

