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 } ] } ] } ] } ] } ] } ]
关键点说明
- 每一级
$group的_id都保留了上一级需要的分组字段,确保能正确向上聚合 - 用
$push将下一级的聚合结果嵌套到当前级的数组中,形成层级关系 - 整个流程从最细的小时维度开始,逐步向上合并,逻辑清晰且易于维护
内容的提问来源于stack exchange,提问作者Ghazanfar Khan
相关产品推荐
相关产品推荐

