如何使用MongoDB聚合查询统计指定商户的代金券状态数据?
用Mongoose Aggregate统计指定商家的优惠券数据
需求说明
现有Mongoose定义的Voucher接口结构如下:
interface Voucher { ... dateRedeemed?: Date; merchant: string; // 商家用户名 paymentStatus: 'paid' | 'unpaid'; ... }
需要通过VoucherModel.aggregate()方法,为指定merchant统计以下数据(注:你提供的结果接口中totalRedeemed和totalUnredeemed的类型应为number而非Date,属于笔误,以下按统计数量实现):
{ totalPaid: number, // paymentStatus为'paid'的优惠券数量 totalUnpaid: number, // paymentStatus为'unpaid'的优惠券数量 totalRedeemed: number, // dateRedeemed已定义(已兑换)的优惠券数量 totalUnredeemed: number // dateRedeemed未定义(未兑换)的优惠券数量 }
实现代码
const merchantUsername = '目标商家用户名'; const stats = await VoucherModel.aggregate([ // 筛选指定商家的优惠券 { $match: { merchant: merchantUsername } }, // 分组统计各类数据 { $group: { _id: null, // 无需按字段分组,统一统计所有匹配数据 totalPaid: { $sum: { $cond: [{ $eq: ['$paymentStatus', 'paid'] }, 1, 0] } }, totalUnpaid: { $sum: { $cond: [{ $eq: ['$paymentStatus', 'unpaid'] }, 1, 0] } }, totalRedeemed: { $sum: { $cond: [{ $exists: ['$dateRedeemed', true] }, 1, 0] } }, totalUnredeemed: { $sum: { $cond: [{ $exists: ['$dateRedeemed', false] }, 1, 0] } } } }, // 移除自动生成的_id字段,匹配需求结构 { $project: { _id: 0 } } ]); // 兜底处理:无数据时返回全0结果 const result = stats[0] || { totalPaid: 0, totalUnpaid: 0, totalRedeemed: 0, totalUnredeemed: 0 };
代码说明
$match阶段:精准筛选目标商家的优惠券,缩小统计数据集。$group阶段:通过$cond条件判断配合$sum累加器,分别统计四类数据的数量。$project阶段:移除默认生成的_id字段,让返回结果完全符合需求格式。- 兜底逻辑:避免商家无优惠券时返回
undefined,保证结果结构稳定。
内容的提问来源于stack exchange,提问作者Sunday Ezeilo
相关产品推荐
相关产品推荐

