MongoDB查询指定年份各月文档数量(时间字段为毫秒时间戳)
MongoDB按指定年份筛选后统计每月文档数的查询语句
兼容原有写法的完整查询
db.myCollection.aggregate([ { $project: { year: { $year: { $add: [new Date(0), "$time"] } }, month: { $month: { $add: [new Date(0), "$time"] } } } }, { $match: { year: 2021 } }, { $group: { _id: "$month", documentCount: { $sum: 1 } } }, // 可选:按月份升序排列结果 { $sort: { _id: 1 } } ])
查询说明
- 新增
month字段提取逻辑:$month操作符会从转换后的日期中返回1-12的整数,对应1月至12月 $group阶段以月份为分组键,用$sum: 1累加统计每个月的文档总数- 可选的
$sort阶段可直接输出按月份顺序排列的结果,无需手动整理
高性能优化版本(推荐大数据量场景使用)
// 2021年时间范围对应的毫秒级时间戳 const startTime = 1609459200000; // 2021-01-01 00:00:00 UTC const endTime = 1640995200000; // 2022-01-01 00:00:00 UTC db.myCollection.aggregate([ // 优先按时间戳范围过滤,time字段有索引时性能提升明显 { $match: { time: { $gte: startTime, $lt: endTime } } }, { $project: { month: { $month: { $add: [new Date(0), "$time"] } } } }, { $group: { _id: "$month", documentCount: { $sum: 1 } } }, { $sort: { _id: 1 } } ])
优化说明
将时间范围过滤放在聚合第一阶段,可直接利用time字段的索引跳过所有非2021年的文档,避免全表扫描计算年份,查询效率远高于原有写法。
内容的提问来源于stack exchange,提问作者vkr
相关产品推荐
相关产品推荐

