美文网首页
mongodb使用bucket处理趋势图的问题

mongodb使用bucket处理趋势图的问题

作者: awayisblue | 来源:发表于2020-07-09 10:27 被阅读0次

假设现在又日趋势,周趋势,月趋势的图表需要展示,我们可以通过以下的函数获取到bucket的boundary

function getTrendMatch (trendType, fieldName) {

  let dateMatch = {}

  let boundaries = []

  switch (trendType) {

    case 'day':

      dateMatch = {

        $gt: moment().subtract(30, 'days').endOf('day').toDate(),

        $lt: moment().endOf('day').toDate()

      }

      for (let i = 29; i >= -1; i--) {

        boundaries.push(moment().subtract(i, 'days').startOf('day').toDate())

      }

      break

    case 'week':

      dateMatch = {

        $gt: moment().subtract(12, 'week').endOf('week').toDate(),

        $lt: moment().endOf('week').toDate()

      }

      for (let i = 11; i >= -1; i--) {

        boundaries.push(moment().subtract(i, 'week').startOf('week').toDate())

      }

      break

    case 'month':

      dateMatch = {

        $gt: moment().subtract(12, 'month').endOf('month').toDate(),

        $lt: moment().endOf('month').toDate()

      }

      for (let i = 11; i >= -1; i--) {

        boundaries.push(moment().subtract(i, 'month').startOf('month').toDate())

      }

      break

    case 'all':

    default:

  }

  return {

    match: dateMatch,

    bucket: {

      groupBy: `$${fieldName}`,

      boundaries: boundaries,

      default: 'other',

      output: {

        count: { $sum: 1 },

        dates: { $push: `$${fieldName}` }

      }

    }

  }

}

然后通过以下的业务代码来使用:

let { bucket, match } = getTrendMatch(trendType, 'testdate')

    let list = await Model.aggregate([

      {

        $match: {

          testdate: match

        }

      },

      {

        $bucket: bucket

      },

      {

        $project: {

          _id: -1,

          boundary: '$_id',

          // start: { $arrayElemAt: ['$dates', 0] },

          // end: { $arrayElemAt: ['$dates', -1] },

          amount: '$count'

        }

      }

    ])

    let dataMap = {}

    list.forEach((item) => {

      dataMap[item.boundary] = item.amount

    })

    rows = bucket.boundaries.slice(0, -1).map((boundary, key) => {

      return {

        start: boundary,

        end: bucket.boundaries[key + 1],

        amount: dataMap[boundary] || 0

      }

    })

这样,我们就获得了边界日期start及end, 以及这个日期内的数据量,可以展示成一下的折线图的方式:

相关文章

  • mongodb使用bucket处理趋势图的问题

    假设现在又日趋势,周趋势,月趋势的图表需要展示,我们可以通过以下的函数获取到bucket的boundary fun...

  • ubuntu 无法启动mongodb

    问题 1,使用 service mongodb start 启动mongodb,然后查看service mongo...

  • mac使用brew安装mongodb

    mac使用brew安装mongodb,及常见问题 一、使用brew安装 brew 默认将mongodb安装在 /u...

  • 排查MongoDB CPU使用率高的问题

    排查MongoDB CPU使用率高的问题

  • 七牛云数据迁移到网易nos

    使用 qshell 将 bucket 文件迁移到新 bucket 中 安装 qshell 工具。下载地址:qshe...

  • 数据分析

    数据处理的流程 样本选取:(三个问题:大小,总体) 基础图标:不要特别复杂,而是要简洁清晰。 图表 趋势图:时间?...

  • ubuntu 安装awscli及简单使用

    安装: 验证: 配置信息: 简单使用,访问所有bucket列表: 列出某个bucket下的所有object信息: ...

  • ssh端口映射

    考虑到在程序中使用ssh认证连接MongoDB数据库的问题,还折腾了《Java使用SSH连接MongoDB》[ht...

  • mogodb学习报告(一)

    概述 MongoDB是什么? MongoDB的作用,使用场景? MongoDB的使用方式? MongoDB是什么,...

  • MongoDB流程分析,索引使用

    最近使用MongoDB的聚合管道分析流程图的时候,发现了一些性能上的问题,不过问题不大顺利解决,记录一下。 环境:...

网友评论

      本文标题:mongodb使用bucket处理趋势图的问题

      本文链接:https://www.haomeiwen.com/subject/mxdjcktx.html