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

如何使用MongoDB Aggregation Framework查询多时间维度温度统计数据

MongoDB多时间维度温度数据聚合实现方案

首先建议提前为date、deviceId字段建立联合索引,可大幅降低聚合查询的耗时。以下聚合规则中温度默认取时段内平均值,可根据实际需求将$avg替换为$max(最大值)、$min(最小值)、$sum(累计值)等算子。

各维度Aggregation Pipeline实现

小时级聚合

输出格式完全匹配要求,hours字段自动映射为1-24对应0-1点到23-24点:

[
  // 可选:添加$match指定查询的时间范围、设备ID
  {
    $project: {
      deviceId: 1,
      temperature: 1,
      hourOfDay: { $hour: "$date" },
      hourStart: {
        $dateTrunc: {
          date: "$date",
          unit: "hour"
        }
      }
    }
  },
  {
    $group: {
      _id: {
        deviceId: "$deviceId",
        hourStart: "$hourStart"
      },
      avgTemp: { $avg: "$temperature" }
    }
  },
  {
    $project: {
      _id: 0,
      dataType: "Temperature",
      deviceID: "$_id.deviceId",
      timing: "Hourly",
      temperature: "$avgTemp",
      date: "$_id.hourStart",
      hours: { $add: [ { $hour: "$_id.hourStart" }, 1 ] }
    }
  },
  { $sort: { date: 1 } }
]

日级聚合(10月3日-11月3日)

[
  {
    $match: {
      date: {
        $gte: ISODate("2023-10-03T00:00:00.000Z"),
        $lte: ISODate("2023-11-03T23:59:59.999Z")
      }
    }
  },
  {
    $project: {
      deviceId: 1,
      temperature: 1,
      dayStart: {
        $dateTrunc: {
          date: "$date",
          unit: "day"
        }
      }
    }
  },
  {
    $group: {
      _id: {
        deviceId: "$deviceId",
        dayStart: "$dayStart"
      },
      avgTemp: { $avg: "$temperature" }
    }
  },
  {
    $project: {
      _id: 0,
      dataType: "Temperature",
      deviceID: "$_id.deviceId",
      timing: "Daily",
      temperature: "$avgTemp",
      date: "$_id.dayStart"
    }
  },
  { $sort: { date: 1 } }
]

注:如需匹配其他年份的10月3日-11月3日,修改$match中的时间范围即可。

周级聚合(最近7周)

[
  {
    $match: {
      date: {
        $gte: {
          $dateAdd: {
            startDate: "$$NOW",
            unit: "week",
            amount: -7
          }
        }
      }
    }
  },
  {
    $project: {
      deviceId: 1,
      temperature: 1,
      weekStart: {
        $dateTrunc: {
          date: "$date",
          unit: "week",
          startOfWeek: "monday" // 可选,指定周起始为周一,默认是周日
        }
      }
    }
  },
  {
    $group: {
      _id: {
        deviceId: "$deviceId",
        weekStart: "$weekStart"
      },
      avgTemp: { $avg: "$temperature" }
    }
  },
  {
    $project: {
      _id: 0,
      dataType: "Temperature",
      deviceID: "$_id.deviceId",
      timing: "Weekly",
      temperature: "$avgTemp",
      date: "$_id.weekStart"
    }
  },
  { $sort: { date: 1 } }
]

月级聚合

[
  {
    $project: {
      deviceId: 1,
      temperature: 1,
      monthStart: {
        $dateTrunc: {
          date: "$date",
          unit: "month"
        }
      }
    }
  },
  {
    $group: {
      _id: {
        deviceId: "$deviceId",
        monthStart: "$monthStart"
      },
      avgTemp: { $avg: "$temperature" }
    }
  },
  {
    $project: {
      _id: 0,
      dataType: "Temperature",
      deviceID: "$_id.deviceId",
      timing: "Monthly",
      temperature: "$avgTemp",
      date: "$_id.monthStart"
    }
  },
  { $sort: { date: 1 } }
]

其他实现建议

  1. 如果你使用的是MongoDB 5.0及以上版本,建议将数据存储到时序集合中,内置的降采样功能针对该类固定间隔的时序数据做了专项优化,查询性能比普通集合高30%以上,还支持自动按规则归档历史数据。
  2. 如果该类聚合查询的频次很高,可新增预聚合汇总表,通过定时任务定期跑对应维度的聚合结果写入汇总表,查询时直接读取汇总表即可,可大幅降低线上查询延迟,适合高并发访问场景。

内容的提问来源于stack exchange,提问作者Rajkishore Jena

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 17:45:08