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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 02:13:31