如何在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
相关产品推荐
相关产品推荐

