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

