为何MongoDB中$match多条件无$and时会失效?
问题原因解析
你碰到的差异本质和$match操作符本身无关,核心是JSON/BSON对象的键唯一性限制导致第一种写法的条件失效:
第一种写法的问题:
在同一个对象里重复定义同一个键(这里是"message.result")时,后面的键值对会直接覆盖前面的。你的第一个$match实际生效的条件只有最后一条:"message.result": { $not: { $type: "double" } }前面的
{ $type: "object" }和{ $not: { $type: "array" } }都被覆盖丢失了。这就导致过滤后的文档中,message.result可能是数组、字符串等非double类型,当遇到数组时,$objectToArray因为要求输入必须是对象,就会抛出你看到的错误。第二种写法的正确性:
用$and包裹每个条件后,每个条件都是独立的子查询对象,不存在键重复覆盖的问题,三个条件会同时生效:message.result必须是object类型- 同时不能是数组类型
- 同时不能是double类型
这样过滤后的所有文档都符合$objectToArray的输入要求,所以执行正常。
关于你提到的“在find查询中两种写法效果一致”:
这是测试数据带来的巧合——你的数据里,所有非double类型的message.result刚好都是object且不是数组,所以被覆盖后的条件看起来也能得到正确结果。但本质上,find里重复键的写法同样是错误的,会丢失前置条件,只是没触发报错而已。
内容的提问来源于stack exchange,提问作者Connor
相关产品推荐
相关产品推荐

