You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 16:06:08