MongoDB中$match阶段表达式与对象过滤器处理Undefined的结果差异原因
MongoDB聚合$match阶段两种查询结果差异的原因
两种查询的核心行为差异
普通查询语法(第二种):
当写成{ cheese: {$eq: undefined} }时,MongoDB会把这个条件解析为匹配不存在cheese字段的文档。因为你的集合里所有文档都没有该字段,所以会返回全部文档,这是MongoDB对普通查询中undefined的特殊适配逻辑。$expr表达式语法(第一种):
在$expr里使用$eq: ["$cheese", undefined]时,$cheese代表文档中cheese字段的值——由于文档没有这个字段,$cheese会被解析成null。此时表达式实际是在比较null和undefined,而MongoDB中这两个值并不相等,所以没有文档满足条件,返回空结果。
本质原因总结
MongoDB对undefined的处理逻辑在普通查询和聚合表达式中是完全不同的:
- 普通查询里,
$eq: undefined等价于$exists: false,专门用来匹配缺失指定字段的文档; - 聚合表达式里,
undefined是作为字面量处理的,而缺失字段会被视为null,两者比较结果为不相等。
内容的提问来源于stack exchange,提问作者Bear Bile Farming is Torture
相关产品推荐
相关产品推荐

