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

MongoDB按时间维度嵌套聚合IoT传感器数据的实现求助

解决MongoDB IoT传感器数据的多级嵌套分组问题

嘿,我来帮你搞定这个多级嵌套分组的问题!你完全不需要用reduce,MongoDB的聚合管道通过**多级$group**操作就能完美实现你要的嵌套结构,咱们一步步来拆解怎么做。

核心思路

我们需要从最细的维度(小时)开始聚合,然后依次向上合并到天、月、年,最终聚合到channelId,每一步都把下一级的数据嵌套到当前级的数组中,形成清晰的层级结构。

完整聚合管道代码

db.yourCollectionName.aggregate([
  // 第一步:按最细维度分组,聚合每个小时的传感器数据
  {
    $group: {
      _id: {
        channelId: "$channelId",
        year: "$year",
        month: "$month",
        day: "$day",
        hour: "$hour"
      },
      hourData: {
        $push: {
          _id: "$_id",
          value: "$value",
          start: "$start"
        }
      }
    }
  },
  // 第二步:将小时数据聚合到天维度
  {
    $group: {
      _id: {
        channelId: "$_id.channelId",
        year: "$_id.year",
        month: "$_id.month",
        day: "$_id.day"
      },
      days: {
        $push: {
          hour: "$_id.hour",
          data: "$hourData"
        }
      }
    }
  },
  // 第三步:将天数据聚合到月维度
  {
    $group: {
      _id: {
        channelId: "$_id.channelId",
        year: "$_id.year",
        month: "$_id.month"
      },
      months: {
        $push: {
          day: "$_id.day",
          data: "$days"
        }
      }
    }
  },
  // 第四步:将月数据聚合到年维度
  {
    $group: {
      _id: {
        channelId: "$_id.channelId",
        year: "$_id.year"
      },
      years: {
        $push: {
          month: "$_id.month",
          data: "$months"
        }
      }
    }
  },
  // 第五步:将年数据聚合到channelId维度,得到最终嵌套结构
  {
    $group: {
      _id: "$_id.channelId",
      channels: {
        $push: {
          year: "$_id.year",
          data: "$years"
        }
      }
    }
  }
])

示例输出结果

执行上面的管道后,你会得到这样的嵌套结构:

[
  {
    "_id": 3462,
    "channels": [
      {
        "year": 2020,
        "data": [
          {
            "month": "04",
            "data": [
              {
                "day": "07",
                "data": [
                  {
                    "hour": "19",
                    "data": [
                      {
                        "_id": ObjectId("5e8e1af3f1563046e084cf64"),
                        "value": 1636.8770905333,
                        "start": 1586289600001
                      }
                    ]
                  },
                  {
                    "hour": "20",
                    "data": [
                      {
                        "_id": ObjectId("5e8e1af3f1563046e084cf63"),
                        "value": 1665.4116577475,
                        "start": 1586286000001
                      }
                    ]
                  },
                  {
                    "hour": "21",
                    "data": [
                      {
                        "_id": ObjectId("5e8e1af3f1563046e084cf65"),
                        "value": 462.2382850719,
                        "start": 1586293200001
                      }
                    ]
                  }
                ]
              }
            ]
          }
        ]
      }
    ]
  }
]

关键点说明

  1. 每一级$group的_id都保留了上一级需要的分组字段,确保能正确向上聚合
  2. 用$push将下一级的聚合结果嵌套到当前级的数组中,形成层级关系
  3. 整个流程从最细的小时维度开始,逐步向上合并,逻辑清晰且易于维护

内容的提问来源于stack exchange,提问作者Ghazanfar Khan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 08:57:30