如何仅用$elemMatch提取test1数组含'a'的MongoDB文档
解决MongoDB用$elemMatch提取包含指定元素的数组对象问题
首先,你的原查询返回空是因为对$elemMatch的使用场景理解有误,下面直接给出正确的实现方式和原因:
1. 匹配包含目标元素的文档
如果只是要找出存在符合条件的test元素的文档,不需要嵌套两层$elemMatch,简化写法即可:
db.comments.find({ "test": { "$elemMatch": { "test1": "a" // 字符串数组包含指定元素,直接写值即可匹配 } } })
甚至可以更简洁,因为MongoDB对数组字段的等于查询默认就是“数组中存在该元素”:
db.comments.find({ "test.test1": "a" })
2. 仅提取test数组中符合条件的对象
如果你的需求是只返回test数组里那些test1包含"a"的对象(而非整个文档的所有test元素),需要在投影阶段使用$elemMatch:
db.comments.find( { "test.test1": "a" }, // 先匹配符合条件的文档 { "test": { "$elemMatch": { "test1": "a" } } } // 仅返回test数组中匹配的元素 )
注意:投影里的$elemMatch默认只会返回数组中第一个匹配的元素,若要返回所有匹配项,MongoDB 3.2+需用$filter聚合操作,但这超出了“仅用$elemMatch”的限制。
原查询出错的原因
你原查询中"test1": { "$elemMatch": { "$eq": "a" } }是错误用法:$elemMatch针对的是元素为文档的数组,而test1是字符串数组,直接用"test1": "a"就能匹配包含"a"的数组,多余的嵌套导致条件不匹配,所以返回空结果。
内容的提问来源于stack exchange,提问作者Wrapper
相关产品推荐
相关产品推荐

