如何通过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" }]] } } } ])
各阶段说明:
- $match:过滤出最近两年内的记录,避免统计无关数据。
- $group:利用
$dayOfWeek提取日期对应的星期数字(MongoDB中1代表周日,7代表周六),并累加该星期的浏览量总和。 - $addFields:通过
$switch将星期数字转换为你需要的英文名称,和期望结果格式统一。 - $unionWith:生成包含所有星期的基准数据,每个星期初始浏览量设为0,保证最终结果不会遗漏任何星期。
- $group:再次按星期名称分组,将实际统计值和基准的0相加,实际值会覆盖0,确保有数据的星期显示真实总和。
- $replaceRoot:用
$arrayToObject将分组结果转换为你需要的键值对对象格式。
测试数据验证:
代入你提供的测试数据执行查询,会得到与你期望完全一致的结果:
{ "monday": 4, "tuesday": 4, "wednesday": 8, "thursday": 0, "friday": 6, "saturday": 0, "sunday": 0 }
内容的提问来源于stack exchange,提问作者StormTrooper
相关产品推荐
相关产品推荐

