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

如何通过MongoDB查询按星期统计指定周期内的浏览量总和?

可以通过MongoDB聚合查询实现该需求

以下是完整的聚合查询语句,能直接得到你期望的结果:

db.Views.aggregate([
  // 筛选近两年内的数据
  {
    $match: {
      created_at: {
        $gte: new Date(Date.now() - 2 * 365 * 24 * 60 * 60 * 1000)
      }
    }
  },
  // 按星期数字分组,计算对应总浏览量
  {
    $group: {
      _id: { $dayOfWeek: "$created_at" },
      totalViews: { $sum: "$views" }
    }
  },
  // 将星期数字映射为英文名称
  {
    $addFields: {
      dayName: {
        $switch: {
          branches: [
            { case: { $eq: ["$_id", 1] }, then: "sunday" },
            { case: { $eq: ["$_id", 2] }, then: "monday" },
            { case: { $eq: ["$_id", 3] }, then: "tuesday" },
            { case: { $eq: ["$_id", 4] }, then: "wednesday" },
            { case: { $eq: ["$_id", 5] }, then: "thursday" },
            { case: { $eq: ["$_id", 6] }, then: "friday" },
            { case: { $eq: ["$_id", 7] }, then: "saturday" }
          ]
        }
      }
    }
  },
  // 构造包含所有星期的基准数据集(确保无数据的星期显示0)
  {
    $unionWith: {
      coll: {
        $documents: [
          { dayName: "monday", totalViews: 0 },
          { dayName: "tuesday", totalViews: 0 },
          { dayName: "wednesday", totalViews: 0 },
          { dayName: "thursday", totalViews: 0 },
          { dayName: "friday", totalViews: 0 },
          { dayName: "saturday", totalViews: 0 },
          { dayName: "sunday", totalViews: 0 }
        ]
      }
    }
  },
  // 按星期名称重新分组,合并统计值
  {
    $group: {
      _id: "$dayName",
      totalViews: { $sum: "$totalViews" }
    }
  },
  // 转换为目标键值对格式
  {
    $replaceRoot: {
      newRoot: {
        $arrayToObject: [[{ k: "$_id", v: "$totalViews" }]]
      }
    }
  }
])

各阶段说明:

  1. $match:过滤出最近两年内的记录,避免统计无关数据。
  2. $group:利用$dayOfWeek提取日期对应的星期数字(MongoDB中1代表周日,7代表周六),并累加该星期的浏览量总和。
  3. $addFields:通过$switch将星期数字转换为你需要的英文名称,和期望结果格式统一。
  4. $unionWith:生成包含所有星期的基准数据,每个星期初始浏览量设为0,保证最终结果不会遗漏任何星期。
  5. $group:再次按星期名称分组,将实际统计值和基准的0相加,实际值会覆盖0,确保有数据的星期显示真实总和。
  6. $replaceRoot:用$arrayToObject将分组结果转换为你需要的键值对对象格式。

测试数据验证:

代入你提供的测试数据执行查询,会得到与你期望完全一致的结果:

{
  "monday": 4,
  "tuesday": 4,
  "wednesday": 8,
  "thursday": 0,
  "friday": 6,
  "saturday": 0,
  "sunday": 0
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 07:45:59