如何合并两个MongoDB聚合查询实现双维度用户统计?
合并MongoDB聚合查询实现多统计值一次性获取
当然可以把这两个查询合并成一次聚合操作,这样不仅减少了对数据库的请求次数,还能提升查询效率(只需要扫描一次符合条件的文档)。
核心思路是利用MongoDB的$cond条件操作符,在同一个$group阶段里同时计算两个统计值:
- 先通过
$match统一筛选出isAdmin: false且isActive: true的用户 - 在
$group阶段,用$sum配合$cond分别统计总数和近7天创建的用户数
下面是完整的实现代码:
var oneWeekAgo = new Date(); oneWeekAgo.setDate(oneWeekAgo.getDate() - 7); User.aggregate([ // 先过滤掉不符合基础条件的用户,减少后续处理数据量 { $match: { isAdmin: false, isActive: true } }, // 一次性计算两个统计值 { $group: { _id: null, // 统计所有符合基础条件的用户总数 totalCount: { $sum: 1 }, // 统计近7天创建的用户数:用$cond判断日期,满足则加1,否则加0 lastWeekTotal: { $sum: { $cond: { if: { $gte: ["$dateCreated", oneWeekAgo] }, then: 1, else: 0 } } } } } ])
代码说明:
$match阶段:先把非管理员且活跃的用户筛选出来,避免后续处理无关数据,提升性能totalCount:直接用$sum:1累加所有进入$group阶段的文档数量,就是符合基础条件的总用户数lastWeekTotal:通过$cond判断当前文档的dateCreated是否晚于一周前的日期,满足条件则返回1,否则返回0,再用$sum累加这些值,得到近7天的用户数
执行这个聚合查询后,你会得到和预期一致的结果:
[ { _id: null, totalCount: 100 , lastWeekTotal: 10 } ]
内容的提问来源于stack exchange,提问作者ertemishakk
相关产品推荐
相关产品推荐

