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

如何在MongoDB中按日期区间统计每日订单数及金额总和?

问题描述

我有如下MongoDB查询语句:

db.orders.aggregate([
  {
    $addFields: {
      dateOnly: {
        "$dateToString": {
          "date": "$creation_date",
          "format": "%Y-%m-%d"
        }
      }
    }
  },
  {
    $match: {
      dateOnly: "2022-01-12"
    }
  },
  {
    $group: {
      _id: null,
      num: {
        $sum: 1
      }
    }
  }
])

该查询返回如下结果:

{
  _id: null,
  num: 184
}

现在我需要修改dateOnly相关逻辑,使其实现类似MySQL中... WHERE DATE(created_t) BETWEEN '2022-01-12' AND '2022-02-12'的日期范围筛选功能,同时按日期分组统计每日数据,并添加类似SELECT语句中SUM(final_price)的金额求和统计。

期望得到如下格式的结果:

[
    {
      date: "2022-01-12",
      num: 184,
      sum: 25000000
    },
    {
      date: "2022-01-13",
      num: 127,
      sum: 23710000
    },
    ....
] 

请问如何在MongoDB中实现该需求?


修改后的聚合查询

db.orders.aggregate([
  // 先筛选日期范围,直接用日期字段过滤更高效
  {
    $match: {
      creation_date: {
        $gte: ISODate("2022-01-12T00:00:00Z"),
        $lt: ISODate("2022-02-13T00:00:00Z")
      }
    }
  },
  // 提取日期字符串作为分组标识
  {
    $addFields: {
      dateOnly: {
        $dateToString: {
          date: "$creation_date",
          format: "%Y-%m-%d"
        }
      }
    }
  },
  // 按日期分组,统计订单数和总金额
  {
    $group: {
      _id: "$dateOnly",
      num: { $sum: 1 },
      sum: { $sum: "$final_price" }
    }
  },
  // 调整字段名,匹配期望的输出格式
  {
    $project: {
      _id: 0,
      date: "$_id",
      num: 1,
      sum: 1
    }
  },
  // 按日期升序排序(可选,让结果更规整)
  {
    $sort: { date: 1 }
  }
])

核心要点

  • 日期筛选优化:直接对creation_date用$gte和$lt过滤,比先转字符串再匹配性能好得多,还能用上字段索引。用$lt下一天的0点,确保包含结束日当天的所有数据,和MySQL的BETWEEN逻辑一致。
  • 分组统计:以提取的dateOnly作为分组键,同时用$sum统计订单数和总金额。
  • 格式调整:通过$project把分组用的_id重命名为date,去掉冗余的_id字段,完全贴合你要的输出结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 21:15:22