Laravel+MongoDB按日期统计每日任务总数与完成数的代码问题
Laravel + MongoDB 按日期统计任务数解决方案
核心思路
用MongoDB聚合管道完成统计逻辑:
- 展开
data字段的JSON数组(单条数据行对应多个任务) - 将
created_at格式化为纯日期(忽略时分秒)作为分组依据 - 分别统计每组的总任务数和已完成任务数
- 整理结果为前端Vue组件易处理的结构
后端Laravel代码实现
假设你的模型为TaskRecord,对应MongoDB集合:
use App\Models\TaskRecord; use Carbon\Carbon; public function getTaskStats($startDate, $endDate) { $start = Carbon::parse($startDate)->startOfDay(); $end = Carbon::parse($endDate)->endOfDay(); $stats = TaskRecord::raw(function($collection) use ($start, $end) { return $collection->aggregate([ // 筛选日期范围内的数据 [ '$match' => [ 'created_at' => [ '$gte' => $start, '$lte' => $end ] ] ], // 展开data数组的每个任务元素 ['$unwind' => '$data'], // 按格式化后的日期分组统计 [ '$group' => [ '_id' => [ '$dateToString' => [ 'format' => '%Y-%m-%d', 'date' => '$created_at' ] ], 'countAllJobs' => ['$sum' => 1], // 替换$data.is_done为你实际的任务完成标识字段 'countDoneJobs' => [ '$sum' => [ '$cond' => [ ['$eq' => ['$data.is_done', true]], 1, 0 ] ] ] ] ], // 按日期升序排序 ['$sort' => ['_id' => 1]] ]); }); // 整理成前端易处理的键值结构 $result = []; foreach ($stats as $item) { $date = $item['_id']; $result[$date] = [ 'all' => $item['countAllJobs'], 'done' => $item['countDoneJobs'] ]; } // 可选:补全日期范围内的空日期(某天无任务时显示0) $currentDate = $start->copy(); while ($currentDate->lte($end)) { $dateStr = $currentDate->format('Y-m-d'); if (!isset($result[$dateStr])) { $result[$dateStr] = [ 'all' => 0, 'done' => 0 ]; } $currentDate->addDay(); } // 按日期重新排序 ksort($result); return response()->json($result); }
前端Vue组件处理
假设接口返回格式为{ "2024-05-01": { "all": 10, "done": 3 }, ... },示例代码:
<template> <div class="task-stats-container"> <div v-for="(stats, date) in taskStats" :key="date" class="stat-item"> <span class="date">{{ date }}</span> <span class="count">总任务:{{ stats.all }} | 已完成:{{ stats.done }}</span> </div> </div> </template> <script> export default { data() { return { taskStats: {} } }, mounted() { // 调用后端接口,传入目标日期范围 this.fetchTaskStats('2024-05-01', '2024-05-10'); }, methods: { async fetchTaskStats(startDate, endDate) { const response = await fetch(`/api/task-stats?start=${startDate}&end=${endDate}`); this.taskStats = await response.json(); } } } </script>
关键注意事项
- 替换
$data.is_done为你实际的任务完成状态字段(比如status等于'completed') - 确保MongoDB中
created_at字段为Date类型,而非字符串,否则$dateToString无法正常工作 - 若不需要补全空日期,可删除循环补全的代码块
内容的提问来源于stack exchange,提问作者Bear995
相关产品推荐
相关产品推荐

