MongoDB如何查询返回数组元素完全匹配的文档
MongoDB 数组精确匹配查询方案
原有查询失效原因
你使用的$in操作符在查询数组字段时,匹配逻辑为只要目标数组包含查询列表中任意一个值,就判定为命中,不会校验数组长度、是否存在多余元素,因此会返回所有携带school或home标签的文档,无法满足全元素匹配的要求。
具体实现方案
根据是否需要校验数组元素顺序,可选择对应写法:
场景1:元素完全匹配、忽略元素顺序(符合你的需求)
要实现「只要数组包含指定的所有元素、且没有其他多余元素即可命中,不限制元素排列顺序」,查询需要同时满足两个规则:
- 目标数组包含查询给出的全部元素:使用
$all操作符实现 - 目标数组长度和查询数组长度完全一致:使用
$size操作符实现,过滤掉携带额外元素的文档
对应查询语句如下,可匹配["school", "home"]和["home", "school"]两种顺序的数组,且排除带其他标签的文档:
db.test.find({ tags: { $all: ["school", "home"], $size: 2 } })
执行上述语句将仅返回_id=1的文档,完全符合预期。
场景2:元素值+排列顺序完全精确匹配
如果要求数组的元素值、排列顺序、长度三者完全一致才判定为命中,直接将目标数组作为查询条件传入即可:
// 仅匹配tags严格等于["school", "home"]的文档,tags为["home", "school"]不会命中 db.test.find({ tags: ["school", "home"] })
扩展用法
如果需要同时匹配多组不同的目标数组(比如同时匹配["school","home"]和["xxx","yyy","zzz"],均忽略顺序),可以用$or组合多组查询条件:
db.test.find({ $or: [ { tags: { $all: ["school", "home"], $size: 2 } }, { tags: { $all: ["xxx", "yyy", "zzz"], $size: 3 } } ] })
内容的提问来源于stack exchange,提问作者KingFish
相关产品推荐
相关产品推荐

