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

如何在MongoDB中用Aggregate无硬编码日期获取昨日消费总和?

MongoDB聚合管道统计昨日消费总和(无硬编码日期)

针对你的需求,这里提供一个无需硬编码日期的聚合管道方案,完全通过MongoDB的日期操作符动态计算昨日的时间范围,然后统计消费总和:

完整聚合查询

db.consumption_data.aggregate([
  // 第一步:筛选昨日UTC时间范围内的文档
  {
    $match: {
      timestamp: {
        $gte: {
          $dateSubtract: {
            startDate: { $dateTrunc: { date: new Date(), unit: "day" } },
            unit: "day",
            amount: 1
          }
        },
        $lt: { $dateTrunc: { date: new Date(), unit: "day" } }
      }
    }
  },
  // 第二步:统计昨日消费总和
  {
    $group: {
      _id: null,
      totalYesterdayConsumption: { $sum: "$consumption" }
    }
  },
  // 可选:优化输出格式,移除默认的_id字段
  {
    $project: { _id: 0 }
  }
])

各阶段详细解释

1. $match 阶段:动态筛选昨日数据

  • $dateTrunc: { date: new Date(), unit: "day" }:将当前系统日期截断到"天"单位,得到今日UTC时区的0点时间(比如你示例中的2022-09-11T00:00:00.000+00:00)。
  • $dateSubtract:给今日0点时间减去1天,得到昨日UTC时区的0点时间(2022-09-10T00:00:00.000+00:00)。
  • 通过$gte(大于等于昨日0点)和$lt(小于今日0点),精准匹配昨日全天的所有文档。

2. $group 阶段:计算总消费

  • _id: null:指定将所有匹配的文档合并为一个分组(因为我们只需要全局的总和)。
  • $sum: "$consumption":对分组内所有文档的consumption字段求和,得到昨日的总消费金额。

3. $project 阶段(可选)

  • 移除MongoDB默认返回的_id字段,让输出结果更简洁,比如最终结果会是{ "totalYesterdayConsumption": 400 }(对应你示例中的199+201)。

注意事项

  • 如果你的业务使用本地时区而非UTC,需要在$dateTrunc中添加时区参数,比如针对北京时间:
    $dateTrunc: { date: new Date(), unit: "day", timezone: "Asia/Shanghai" }
    
  • 确保集合中的timestamp字段是MongoDB的Date类型,而非字符串类型,否则日期筛选逻辑会失效。

内容的提问来源于stack exchange,提问作者Pooja

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 02:01:14