MongoDB聚合$match阶段使用$cond实现条件查询的可行性咨询
MongoDB聚合条件查询问题解答
原实现的错误点
你的代码写法无法正常运行,核心问题有两个:
$match阶段默认接收普通查询语法,要使用$cond这类聚合操作符,必须嵌套在$expr操作符内部才能生效- 你使用的
$cond语法不符合规范,正确的$cond参数结构是[条件表达式, 真值返回结果, 假值返回结果],不需要额外声明if字段
可行解决方案
这里提供两种可落地的实现方式:
方案1:普通查询语法(优先推荐)
用$or组合互斥条件即可满足需求,该写法属于普通查询范畴,可以命中字段索引,查询效率更高:
db.Collection.aggregate([ { $match: { $or: [ // 字段存在时的匹配规则 { fieldOnCollection: { $exists: true, $eq: 'foo' } }, // 字段不存在时的匹配规则 { fieldOnCollection: { $exists: false }, anotherField: 'bar' } ] } } ]);
方案2:聚合表达式写法
如果你需要结合更复杂的聚合逻辑,可以用$expr包裹$cond实现需求:
db.Collection.aggregate([ { $match: { $expr: { $cond: [ // 聚合表达式判断字段是否存在 { $ne: [ { $type: "$fieldOnCollection" }, "missing" ] }, // 字段存在时的匹配逻辑 { $eq: [ "$fieldOnCollection", "foo" ] }, // 字段不存在时的匹配逻辑 { $eq: [ "$anotherField", "bar" ] } ] } } } ]);
内容的提问来源于stack exchange,提问作者user2402616
相关产品推荐
相关产品推荐

