如何在MongoDB聚合$match阶段正确使用$in匹配数组多条件
问题原因分析
你写的$expr查询无法生效有三个核心问题:
- 参数顺序错误:MongoDB的
$expr中$in的语法是{ $in: [ <待匹配值>, <搜索数组> ] },你将数组字段$rooms.type放在了第一个参数位,相当于判断整个type数组整体是否存在于右侧的单元素数组中,逻辑完全不成立。 - 逻辑运算符用错:你最初写的重复键查询,MongoDB会隐式转换为
$and逻辑,要求文档同时满足「存在type为shelter的房间」和「存在type为box的房间」两个条件,而你替换成了$or,逻辑本身就和需求不符。 - 未处理数组字段匹配逻辑:直接对数组字段
$rooms.type做整体判断,没有校验数组内是否有元素满足条件。
正确实现方案
方案1:使用$and包装查询(最推荐,和原写法效果完全一致)
直接用$and包裹两个条件,规避JS对象重复键的问题,性能和原生隐式查询完全一致:
{ $and: [ { "rooms.type": { $in: ["shelter"] } }, { "rooms.type": { $in: ["box"] } } ] }
方案2:修正后的$expr写法
如果必须用$expr实现,调整参数顺序和逻辑运算符即可:
{ $expr: { $and: [ { $in: ["shelter", "$rooms.type"] }, { $in: ["box", "$rooms.type"] } ] } }
内容的提问来源于stack exchange,提问作者Julius
相关产品推荐
相关产品推荐

