MongoDB技术求助:计算接通等待时长<60秒的通话占比
MongoDB聚合查询:计算短等待时长接通通话占比
需求说明
MongoDB集合包含callDirection、status、duration、billsec字段,需要完成:
- 筛选出接通等待时长(
duration-billsec)小于60秒的通话; - 计算这类通话在所有
status为ANSWERED的已接通通话中的占比。
解决思路
- 前置过滤:先筛选出所有
status等于ANSWERED的通话,缩小计算范围; - 分组统计:在分组阶段同时统计两个关键数值:
- 已接通通话的总数量;
- 等待时长小于60秒的通话数量;
- 计算占比:通过投影阶段,用短等待时长的数量除以已接通总数得到占比。
完整聚合查询代码
db.collection.aggregate([ // 第一步:过滤出所有已接通的通话 { $match: { status: "ANSWERED" } }, // 第二步:分组统计总数和符合条件的数量 { $group: { _id: 0, totalAnswered: { $sum: 1 }, shortWaitCount: { $sum: { $cond: [ { $lt: [ { $subtract: [ "$duration", "$billsec" ] }, 60 ] }, 1, 0 ] } } } }, // 第三步:计算占比,保留两位小数优化可读性 { $project: { _id: 0, totalAnswered: 1, shortWaitCount: 1, shortWaitRatio: { $round: [ { $divide: [ "$shortWaitCount", "$totalAnswered" ] }, 2 ] } } } ])
代码说明
$match阶段:只保留status为ANSWERED的文档,减少后续计算的数据量;$group阶段:totalAnswered:统计所有已接通通话的总数;shortWaitCount:用$cond判断duration - billsec是否小于60,符合条件则累加1;
$project阶段:用$divide计算占比,$round将结果保留两位小数,方便查看。
内容的提问来源于stack exchange,提问作者Assaf Schwartz
相关产品推荐
相关产品推荐

