Mongoose Aggregate match阶段判断数组是否包含另一数组任意值的问题
Mongoose Aggregate 数组交集匹配解决方案
原写法错误原因
你之前的写法中调用了searchArray.toString(),会将查询数组直接拼接为单个逗号分隔的字符串(例如["coding", "reading"]会被转为"coding,reading"),相当于在hobbies数组中匹配是否存在元素等于这个长字符串,自然只有查询数组长度为1时才能得到正确结果,多值场景完全不匹配。
正确实现方案
方案一:普通$in查询(推荐,性能最优)
MongoDB针对数组字段的$in查询天然支持「字段数组存在任意元素匹配查询数组任意元素」的逻辑,不需要额外加$expr,还可以命中hobbies字段的索引,性能最好:
// 定义查询数组 const searchArray = ["coding", "reading"]; // aggregate 中的$match阶段写法 { "$match": { "hobbies": { "$in": searchArray } } }
方案二:$expr场景下用交集判断
如果你有必须在$expr内做判断的场景(比如需要和其他聚合表达式结合使用),可以通过$setIntersection计算两个数组的交集,判断交集长度是否大于0即可:
const searchArray = ["coding", "reading"]; { "$match": { "$expr": { "$gt": [ { "$size": { "$setIntersection": [ "$hobbies", searchArray ] } }, 0 ] } } }
原理说明:
$setIntersection会返回两个数组的公共元素组成的新数组$size获取交集数组的长度,只要长度大于0就说明两个数组存在匹配元素
内容的提问来源于stack exchange,提问作者API
相关产品推荐
相关产品推荐

