MongoDB聚合管道按天分组并保留空分组的实现方案
解决MongoDB统计过去90天每日文档数(含空日期补0)
要实现包含无文档日期的统计,核心是先构造出过去90天的完整日期列表,再和已有统计结果做左关联,自动补全count为0的情况。以下是完整的聚合管道:
[ // 第一步:生成过去90天的完整日期序列 { $addFields: { startDate: { $subtract: [new Date(), 90 * 24 * 60 * 60 * 1000] }, dayOffsets: { $range: [0, 90] } // 生成0到89的数字,对应90天的偏移量 } }, { $unwind: "$dayOffsets" }, // 展开偏移量数组,每个偏移对应一条日期记录 { $addFields: { date: { $dateToString: { format: "%Y-%m-%d", date: { $add: ["$startDate", { $multiply: ["$dayOffsets", 24 * 60 * 60 * 1000] }] } } } } }, { $project: { _id: 0, date: 1 } }, // 只保留格式化后的日期字段 // 第二步:关联原统计结果,补全count值 { $lookup: { from: "your_collection_name", // 替换成你的集合名称 let: { targetDate: "$date" }, pipeline: [ { $match: { $expr: { $and: [ { $gte: ["$createdAt", { $subtract: [new Date(), 90 * 24 * 60 * 60 * 1000] }] }, { $eq: [{ $dateToString: { format: "%Y-%m-%d", date: "$createdAt" } }, "$$targetDate"] } ] } } }, { $count: "count" } ], as: "stats" } }, { $project: { date: 1, count: { $ifNull: [{ $arrayElemAt: ["$stats.count", 0] }, 0] } } }, { $sort: { date: 1 } } // 按日期升序排列,可选 ]
代码说明:
- 生成日期序列:通过
$range创建90个偏移量,结合起始日期计算出每天的具体日期并格式化,确保覆盖过去90天的所有日期。 - 关联统计:用
$lookup在目标集合中查询对应日期的文档数,$count直接统计数量。 - 补全0值:用
$ifNull判断是否有统计结果,没有则设为0,完美补全空日期的统计值。
内容的提问来源于stack exchange,提问作者Karolis
相关产品推荐
相关产品推荐

