MongoDB聚合中基于items数组的条件匹配文档实现求助
MongoDB聚合管道匹配逻辑解决方案
直接用$match阶段结合$or操作符就能实现需求,不需要复杂的$cond,以下是具体代码(假设目标ID为4):
db.yourCollection.aggregate([ { $match: { $or: [ { items: { $exists: false } }, { items: [] }, { items: 4 } ] } } ])
逻辑拆解
{ items: { $exists: false } }:匹配没有items字段的文档{ items: [] }:匹配items为空数组的文档{ items: 4 }:MongoDB原生支持数组匹配,此条件会自动匹配items数组中包含4的文档(等价于{ items: { $in: [4] } })
用$expr的等价写法
如果一定要用$expr(比如需要在聚合中引用变量或计算字段),可以这样写:
db.yourCollection.aggregate([ { $match: { $expr: { $or: [ { $not: { $exists: "$items" } }, { $eq: ["$items", []] }, { $in: [4, "$items"] } ] } } } ])
验证示例
- 当文档
items: [1,2,3]、目标ID=4:三个条件均不满足,不匹配 - 当文档
items: []、目标ID=4:第二个条件满足,匹配 - 当文档
items: [4,5]、目标ID=4:第三个条件满足,匹配 - 当文档无items字段、目标ID=4:第一个条件满足,匹配
内容的提问来源于stack exchange,提问作者dzm
相关产品推荐
相关产品推荐

