MongoDB对Order模型实现含已完成订单统计的复杂聚合查询
Mongoose 订单按用户分组聚合(含已完成订单统计)实现
直接在原有$group阶段通过$cond条件运算符做条件累加即可,单次聚合就能返回所有需要的字段,不需要拆分查询,修改后的代码如下:
const usersOrderSummary = await Order.aggregate([ { $match: {} // 全量统计留空即可,需要筛选指定时间/状态的订单可在此处加匹配规则 }, { $group: { _id: "$user", // 保留原有全量订单统计逻辑 TotalSpent: { $sum: "$totalPrice" }, TotalOrders: { $sum: 1 }, // 追加已完成订单统计:仅统计isDelivered为true的订单 TotalCompletedOrderSpent: { $sum: { $cond: [{ $eq: ["$isDelivered", true] }, "$totalPrice", 0] } }, TotalCompletedOrders: { $sum: { $cond: [{ $eq: ["$isDelivered", true] }, 1, 0] } } } } ])
逻辑说明
- 原有统计字段
TotalSpent、TotalOrders的计算逻辑和返回结果完全和之前一致,不会影响现有业务 $cond为聚合管道的条件判断表达式,配合$sum累加器即可实现条件求和、条件计数:判断订单是否满足isDelivered: true,满足则累加对应金额/计数+1,不满足则加0,不影响总和计算- 返回结果结构完全匹配需求,每个用户的统计项会自动追加已完成订单的两个统计字段
若存在
isDelivered字段为null或未赋值的历史订单,上述逻辑会默认将其归为未完成订单,不计入已完成统计,符合常规业务逻辑。如果需要调整已完成订单的判定规则,直接修改$cond内的判断条件即可。
内容的提问来源于stack exchange,提问作者MBŠ
相关产品推荐
相关产品推荐

