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

MongoDB聚合查询新“千年虫”问题:无法获取最近两周数据

解决MongoDB聚合管道返回最近两周数据的问题

我明白你遇到的棘手问题了——用了半年的聚合管道,因为没做时间范围过滤,直接对两年的全量数据分组,再靠$limit:2只能拿到随机的周数据,完全不是你想要的最近两周统计。别慌,咱们调整下管道逻辑就能精准拿到目标数据。

问题根源

你的原管道跳过了前置时间过滤这关键一步,直接对所有历史数据分组。MongoDB在没指定排序规则的情况下,分组结果的顺序是不确定的,所以$limit:2自然返回随机的周数据,而非你需要的最新两周。

解决方案:先过滤时间,再分组统计

我们需要先通过$match筛选出最近两周内创建的文档,再执行后续的分组、投影操作,最后按周数倒序排序,确保拿到的是最新的两周数据。

这里的核心是准确计算时间范围:ISO周以周一为起始,所以我们要筛选出从上周一开始到现在的所有数据,这样就能完整覆盖上周和本周的全部记录。

修改后的完整聚合管道

[
  // 第一步:过滤最近两周的文档(请根据业务时区调整timezone参数)
  {
    $match: {
      createdAt: {
        $gte: {
          $dateSubtract: {
            startDate: new Date(),
            unit: "week",
            amount: 1,
            timezone: "Europe/Zurich" // 比如你的数据来自瑞士网站,用这个时区能避免周数计算偏差
          }
        }
      }
    }
  },
  // 保留你原有的分组统计逻辑
  {
    $group: {
      _id: { $isoWeek: "$createdAt" },
      count: { $sum: 1 },
      fonte: { $push: "$source" },
      appointments: { $push: "$appointment" }
    }
  },
  // 新增排序:按周数倒序,确保最新的周排在前面
  { $sort: { _id: -1 } },
  // 保留你原有的字段调整逻辑
  { $addFields: { week: "$_id" } },
  { $project: { _id: 0 } },
  // 限制返回2条,正好是最近两周的数据
  { $limit: 2 }
]

关键细节说明

  1. 时区设置:$dateSubtract和$isoWeek都依赖时区,一定要设置和业务匹配的时区(比如例子中的欧洲苏黎世时区),否则会出现周数计算偏差的问题。
  2. 时间范围计算:$dateSubtract从当前日期减去1周,得到上周一开始的时间,这样筛选出的文档正好包含上周和本周的所有数据。
  3. 排序操作:新增$sort: { _id: -1 }确保分组后的周数从大到小排列,再用$limit:2就能精准拿到当前周和上周的统计结果。

效果验证

调整后,管道会先过滤掉两年历史数据中不属于最近两周的部分,再进行分组统计,最终返回的就是你期望的第2周和第1周的生产统计数据,完美适配后续JS处理和CRM展示需求。

内容的提问来源于stack exchange,提问作者Mattia Rasulo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 08:12:31