MongoDB聚合查询:实现OR条件匹配并返回匹配次数
实现OR条件匹配并统计命中数量的聚合查询
这个需求挺实用的——既要通过OR条件筛选文档,还要统计每条文档命中了几个条件对吧?我来给你捋捋怎么用MongoDB的聚合管道实现:
首先得明确你要匹配的三个OR条件是:
A = 1A = 3c = "test"
接下来可以用聚合管道分两步实现,先筛选符合条件的文档,再统计命中数:
完整聚合查询代码
db.yourCollectionName.aggregate([ // 第一步:先过滤出至少匹配一个OR条件的文档,减少后续计算量 { $match: { $or: [ { A: 1 }, { A: 3 }, { c: "test" } ] } }, // 第二步:添加count字段,统计命中的条件数量 { $addFields: { count: { $sum: [ // 判断是否命中A=1,满足记1,不满足记0 { $cond: [{ $eq: ["$A", 1] }, 1, 0] }, // 判断是否命中A=3 { $cond: [{ $eq: ["$A", 3] }, 1, 0] }, // 判断是否命中c=test { $cond: [{ $eq: ["$c", "test"] }, 1, 0] } ] } } } ])
代码逻辑解释
- $match阶段:用
$or把三个条件组合起来,只保留至少满足一个条件的文档,避免对无关文档做统计,能有效提升查询效率。 - $addFields阶段:
- 用
$cond逐个判断每个条件是否满足,满足返回1,不满足返回0; - 最后用
$sum把这三个判断结果相加,得到这条文档命中的条件总数,存到新增的count字段里。
- 用
测试结果验证
用你提供的示例文档执行这个查询,会得到完全符合你期望的结果:
[ { "A": 1, "B": 2, "c": "x", "count": 1 }, // 仅命中A=1条件 { "A": 3, "B": 2, "c": "play", "count": 1 }, // 仅命中A=3条件 { "A": 1, "B": 2, "c": "test", "count": 2 } // 命中A=1和c=test两个条件 ]
如果后续需要调整查询条件,只需要修改$match里的$or数组,以及$sum里对应的$cond判断即可,灵活性拉满~
内容的提问来源于stack exchange,提问作者nishant kumar
相关产品推荐
相关产品推荐

