MongoDB中如何结合$or与$cond实现按type匹配对应status的查询
错误原因
你原有写法无法运行的核心问题是 $cond 属于聚合操作符,不能直接作为find()的顶层查询条件使用,要么搭配$expr包裹聚合表达式使用,要么直接用基础逻辑运算符组合条件即可实现需求,后者性能和可读性都更高。
最优实现方案(推荐)
你的需求本质上是匹配两类符合规则的文档,直接用$or组合两类条件即可,不需要用到分支判断:
db.collection.find({ $or: [ // 匹配checkbox类型的合法状态 { "type": "checkbox", "status": { $in: ["completed", "process"] } }, // 匹配radio类型的合法状态 { "type": "radio", "status": "completed" } ] })
该写法属于MongoDB普通查询语法,可以命中你提前建立的type、status相关索引,查询性能最优。
基于$cond的实现方案
如果你确实需要用分支判断的逻辑实现,可以用$expr包裹聚合表达式后放入查询条件:
db.collection.find({ $expr: { $cond: { if: { $eq: ["$type", "checkbox"] }, then: { $in: ["$status", ["completed", "process"]] }, else: { $eq: ["$status", "completed"] } } } })
该写法属于聚合表达式查询,无法直接命中普通字段索引,非必要不推荐使用。
内容的提问来源于stack exchange,提问作者simon
相关产品推荐
相关产品推荐

