如何用PHP+MongoDB实现按日期分组统计John的访问量
修正PHP+MongoDB实现按日期分组统计访问量(含0值日期)
原代码问题分析
$group阶段使用_id: null会将所有匹配数据合并为单一分组,无法实现按日期拆分统计。- 仅依赖聚合查询无法自动生成无访问记录的日期(即VISITS=0的情况),需额外处理日期范围补全。
修正后的完整代码
<?php // 1. 聚合查询:获取John有访问记录的日期及对应访问量 $aggregatedData = $collection->aggregate([ ['$match' => ['user' => 'john']], ['$group' => [ '_id' => '$date', // 按date字段分组 'VISITS' => ['$sum' => 1] // 统计每组记录数(即访问量) ]], ['$project' => [ 'DATE' => '$_id', 'VISITS' => 1, '_id' => 0 ]] ]); // 2. 将聚合结果转为日期=>访问量的关联数组 $visitsMap = []; foreach ($aggregatedData as $item) { $visitsMap[$item['DATE']] = $item['VISITS']; } // 3. 定义需要展示的日期范围(根据需求调整) $startDate = new DateTime('2022-01-01'); $endDate = new DateTime('2022-01-05'); // 4. 遍历日期范围,输出每个日期的访问量(无记录则显示0) $currentDate = clone $startDate; while ($currentDate <= $endDate) { $dateStr = $currentDate->format('Y-m-d'); $visits = $visitsMap[$dateStr] ?? 0; echo "DATE: {$dateStr} VISITS: {$visits}<br>"; $currentDate->modify('+1 day'); } ?>
代码说明
- 聚合阶段:通过
$match筛选John的记录,$group按date字段分组统计访问量,$project调整输出字段格式。 - 日期补全:手动生成目标日期范围,遍历每个日期时,从关联数组中读取对应访问量,无匹配则设为0,确保所有日期都被展示。
内容的提问来源于stack exchange,提问作者Łukasz Trześniewski
相关产品推荐
相关产品推荐

