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

为何MongoDB中$match多条件无$and时会失效?

问题原因解析

你碰到的差异本质和$match操作符本身无关,核心是JSON/BSON对象的键唯一性限制导致第一种写法的条件失效:

  • 第一种写法的问题:
    在同一个对象里重复定义同一个键(这里是"message.result")时,后面的键值对会直接覆盖前面的。你的第一个$match实际生效的条件只有最后一条:

    "message.result": { $not: { $type: "double" } }
    

    前面的{ $type: "object" }和{ $not: { $type: "array" } }都被覆盖丢失了。这就导致过滤后的文档中,message.result可能是数组、字符串等非double类型,当遇到数组时,$objectToArray因为要求输入必须是对象,就会抛出你看到的错误。

  • 第二种写法的正确性:
    用$and包裹每个条件后,每个条件都是独立的子查询对象,不存在键重复覆盖的问题,三个条件会同时生效:

    1. message.result必须是object类型
    2. 同时不能是数组类型
    3. 同时不能是double类型
      这样过滤后的所有文档都符合$objectToArray的输入要求,所以执行正常。

关于你提到的“在find查询中两种写法效果一致”:
这是测试数据带来的巧合——你的数据里,所有非double类型的message.result刚好都是object且不是数组,所以被覆盖后的条件看起来也能得到正确结果。但本质上,find里重复键的写法同样是错误的,会丢失前置条件,只是没触发报错而已。

内容的提问来源于stack exchange,提问作者Connor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 07:50:31