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

Laravel+MongoDB按日期统计每日任务总数与完成数的代码问题

Laravel + MongoDB 按日期统计任务数解决方案

核心思路

用MongoDB聚合管道完成统计逻辑:

  1. 展开data字段的JSON数组(单条数据行对应多个任务)
  2. 将created_at格式化为纯日期(忽略时分秒)作为分组依据
  3. 分别统计每组的总任务数和已完成任务数
  4. 整理结果为前端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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 10:12:24