MongoDB是否支持嵌套查询?求等价SQL的聚合实现方案
将SQL查询转换为MongoDB聚合管道
针对你要实现的EFFORTS = 特定处理者的高优先级Infodocs总数 / 该处理者的Infodocs总数 * 100并取整的需求,不需要拆分两个子查询,通过一次聚合管道就能完成计算。以下是完整的实现代码:
db.INFODOCS.aggregate([ // 筛选出指定处理者的所有文档 { $match: { PROCESSOR_ID: "userid" } }, // 分组统计总数和高优先级文档数 { $group: { _id: null, // 无需按字段分组,仅统计全局结果 totalCount: { $sum: 1 }, // 统计该处理者的总文档数 highPriorityCount: { $sum: { $cond: { if: { $eq: ["$ML_PRIORITY", "HIGH"] }, then: 1, else: 0 } } } } }, // 计算EFFORTS并处理除数为0的异常情况 { $project: { _id: 0, // 隐藏默认的_id字段 EFFORTS: { $round: { $cond: { if: { $eq: ["$totalCount", 0] }, then: 0, // 无文档时返回0,避免除以0错误 else: { $multiply: [{ $divide: ["$highPriorityCount", "$totalCount"] }, 100] } } } } } } ])
各阶段说明:
- $match阶段:先把计算范围缩小到指定
PROCESSOR_ID的文档,减少后续计算的数据量,对应SQL中两个子查询的PROCESSOR_ID = userid条件。 - $group阶段:
totalCount: { $sum: 1 }:统计该处理者的总文档数,对应SQL第二个子查询的COUNT(*)。highPriorityCount:用$cond判断每个文档的ML_PRIORITY是否为HIGH,符合条件则累加1,否则累加0,最终得到高优先级文档总数,对应SQL第一个子查询的COUNT(*)。
- $project阶段:
- 用
$divide计算占比,乘以100后通过$round取整,得到最终的EFFORTS。 - 加入
$cond判断totalCount是否为0,避免出现除以0的运行错误。
- 用
批量计算所有处理者的EFFORTS
如果需要一次性统计所有处理者的占比,只需要修改$group的_id为"$PROCESSOR_ID"即可:
db.INFODOCS.aggregate([ { $group: { _id: "$PROCESSOR_ID", // 按处理者分组统计 totalCount: { $sum: 1 }, highPriorityCount: { $sum: { $cond: { if: { $eq: ["$ML_PRIORITY", "HIGH"] }, then: 1, else: 0 } } } } }, { $project: { EFFORTS: { $round: { $cond: { if: { $eq: ["$totalCount", 0] }, then: 0, else: { $multiply: [{ $divide: ["$highPriorityCount", "$totalCount"] }, 100] } } } } } } ])
内容的提问来源于stack exchange,提问作者ankit lohiya
相关产品推荐
相关产品推荐

