关于MongoDB处理统计图数据(按天,小时)

说明:本文基于nest.js,typescript语法,mongoose,moment

目录

需要导的包:

第一种方法:正常循环 

第二种方法:通过分组将数据按照所需时间分组 


前言:在网上找了很长时间,最终总结了如下两种方法,仅供参考  

需要导的包:

import * as moment from 'moment';

import { DateTime } from 'ts-luxon'; 

import { InjectModel } from '@nestjs/mongoose'; 

第一种方法:正常循环 

//近七天趋势分析
      const water_rush_chart = [];
      for (let i = 0; i < 7; i++) {
        const count = await this.WaterRushModel.aggregate([
          {
            $match: {
              create_time: {
                $gte: DateTime.local().plus({ day: -i }).startOf('day'),//前i天的00:00
                $lte: DateTime.local().plus({ day: -i }).endOf('day'),//前i天的59:59秒
              },
            },
          },
            //分组
          {
            $group: {
              _id: null,    //根据什么分组
              value: { $sum: '$flow' },    //求需要的字段值之和,$sum为求和,$flow为字段
              dataDate: { $push: '$dataDate' },
            },
          },
        ]);

        water_rush_chart.unshift({
          x: DateTime.local()
            .plus({ day: -(i + 1) })
            .toFormat('LL-dd'),    //转化为月-日
          y: count[0] ? count[0].value.toFixed(2) : 0,
          s: '数量',
        });
      }

第二种方法:通过分组将数据按照所需时间分组 

//近24小时趋势图
      const count1 = await this.studentModel.aggregate([
        {
          $match: {
            created_at: {
              $gte: DateTime.local().plus({ hours: -24 }).startOf('hour'),
              $lte: DateTime.local().plus({ hours: -1 }).endOf('hour'),
            },
          },
        },
        //分组
        {
          $group: {
            _id: {
              $subtract: [
                { $subtract: ['$created_at', new Date('1970-01-01')] },
                {
                  $mod: [{ $subtract: ['$created_at', new Date('1970-01-01')] }, 1000 * 60 * 60 /*聚合时间段,24小时*/],
                },
              ],
            },
            name: { $push: '$pump_room_name' },
            score: { $avg: '$score' },
            time: { $push: '$created_at' },
          },
        },
        //排序
        {
          $sort: {
            time: 1,
          },
        },
      ]);

      //数据库查到的数据先存入数组
      const student_arr = [];
      count1.filter((item) => {
        //添加平均成绩
        student_arr.unshift({
          x: moment(item.time[0]).format('HH:00'),
          y: item.score || 0,
          s: '平均成绩',
        });
      });

      //学生平均成绩趋势如(不包含当前小时)
      const studnet_chart = [];
      let num1 = 0;
      for (let i = 0; i < 24; i++) {
        //获取当前时间
        const time = DateTime.local()
          .plus({ hour: -(i + 1) })
          .startOf('hour')
          .toFormat('HH:00');
        //判断所处时间是否有数据
        if (num1 < student_arr.length && student_arr[num1].x === time) {
          student_chart.unshift(student_arr[num1]);
          num1++;
        } else {
          //为了防止数据库数据不全,数据库中没有的默认0
          student_chart.unshift({
            x: time,
            y: 0,
            s: '平均成绩',
          });
        }
      }

两种方法各有优势,具体根据定时任务存储的时间而定.

语法方面也可进行优化,这里不做过多叙述.

如有更好的方法欢迎留言.

这里再分享几篇参考的文章以及感觉比较全面的MongoDB总结:

http://t.csdn.cn/ERi3A

http://t.csdn.cn/ZYBDR

 http://t.csdn.cn/K0MGK

管道相关方法:

http://t.csdn.cn/jekcX

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
ECharts词云图是一种数据可视化的方式,通过使用ECharts库可以实现对数据库中的数据进行读取和展示。实现该功能主要有以下几个步骤: 1. 连接数据库:首先需要使用适当的方式连接到数据库,可以使用MySQL、SQLite、MongoDB等各种数据库。连接数据库需要提供正确的数据库连接地址、用户名和密码等信息,以确保能够成功连接数据库。 2. 读取数据:一旦成功连接到数据库,就可以编写查询语句来读取需要的数据。根据词云图的需求,可能需要读取一个或多个字段的数据,并对数据进行简单的处理,例如去除重复项或按照某种指标进行排序等。 3. 处理数据:根据词云图的要求,需要对数据进行一些必要的处理。例如,可以统计每个词出现的频率,并按照频率的大小进行排序,以便在词云图上更好地展示。 4. 使用ECharts绘制词云图:ECharts是一个功能强大的前端图表库,可以通过它来绘制各种图表,包括词云图。在绘制词云图之前,需要先引入ECharts库,并创建一个适当的容器来显示图表。 5. 构造词云图所需的数据格式:根据ECharts的要求,需要将读取和处理后的数据转换成特定的格式,通常是一个包含名称和值的数组。名称表示词的内容,而值则表示词的权重或出现频率。 6. 使用ECharts进行配置和绘制:最后,通过ECharts提供的API,可以进行一系列的配置,如设置词云图的大小、颜色、形状等,以及添加事件处理程序等。完成配置后,通过调用ECharts的绘制方法,将生成的词云图绘制在上述创建的容器中。 通过以上步骤,就可以实现使用ECharts词云图的画法读取数据库数据。这样,通过数据库中的数据进行可视化的展示,可以更直观地呈现数据的特征和关联,为数据分析和决策提供参考依据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飘飘~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值