You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 03:05:38