基于时间值的MongoDB嵌套聚合

基于时间值的MongoDB嵌套聚合,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我有一个这样的结构来自物联网传感器设备 [{ "_id" : ObjectId("5e8e1af3f1563046e084cf65"), "value" : 462.2382850719, "start" : 1586293200001, "year" : 2020, "month" : "04", "day" : "07", "hour" : "21", "channelId" : 3462 }, { "_id" : O

我有一个这样的结构来自物联网传感器设备

[{
    "_id" : ObjectId("5e8e1af3f1563046e084cf65"),
    "value" : 462.2382850719,
    "start" : 1586293200001,
    "year"  : 2020,
    "month" : "04",
    "day" : "07",
    "hour" : "21",
    "channelId" : 3462
},
{
    "_id" : ObjectId("5e8e1af3f1563046e084cf64"),
    "value" : 1636.8770905333,
    "start" : 1586289600001,
     "year"  : 2020,
    "month" : "04",
    "day" : "07",
    "hour" : "19",
    "channelId" : 3462
},
{
    "_id" : ObjectId("5e8e1af3f1563046e084cf63"),
    "value" : 1665.4116577475,
    "start" : 1586286000001,
    "year"  : 2020,
    "month" : "04",
    "day" : "07",
    "hour" : "20",
    "channelId" : 3462
}]
我想先按channelId对这个结构进行分组,然后按年、月、日和小时进行分组。我想开发这种嵌套结构

{"channel_id":XXX,"aggregates":[2020:[04:[01:[00:AVG_VALUE,01:AVG_VALUE...],...],...]}
像这样

   output = [
    {
        channelId: 3462,
        "value": '',
        aggregates: [
            {
                year: 2020, 
                months: [
                    {
                        month: 4,
                        value: '',
                        days: [
                            {
                                day: 7,
                                value: '',
                                hours: [
                                    { hour: 19, value: '' },
                                    { hour: 20, value: '' },
                                    { hour: 21, value: '' }
                                ]
                            }
                        ]
                    }
                ]
            }

        ]
    }
]
我可以做一个级别的$group by,然后将$$ROOT推入其中,但不知道如何与组嵌套。我是否必须使用reduce逻辑或任何


需要帮助

检查解决方案是否满足您的要求:

db.collection.aggregate([
  {
    $group: {
      _id: {
        "channelId": "$channelId",
        "year": "$year",
        "month": "$month",
        "day": "$day",
        "hour": "$hour"
      },
      value: {
        $avg: "$value"
      }
    }
  },
  {
    $group: {
      _id: {
        "channelId": "$_id.channelId",
        "year": "$_id.year",
        "month": "$_id.month",
        "day": "$_id.day"
      },
      value: {
        $avg: "$value"
      },
      hours: {
        $push: {
          hour: "$_id.hour",
          value: "$value"
        }
      }
    }
  },
  {
    $group: {
      _id: {
        "channelId": "$_id.channelId",
        "year": "$_id.year",
        "month": "$_id.month"
      },
      value: {
        $avg: "$value"
      },
      days: {
        $push: {
          day: "$_id.day",
          value: "$value",
          hours: "$hours"
        }
      }
    }
  },
  {
    $group: {
      _id: {
        "channelId": "$_id.channelId",
        "year": "$_id.year"
      },
      value: {
        $avg: "$value"
      },
      months: {
        $push: {
          month: "$_id.month",
          value: "$value",
          days: "$days"
        }
      }
    }
  },
  {
    $group: {
      _id: {
        "channelId": "$_id.channelId"
      },
      channelId: {
        $first: "$_id.channelId"
      },
      value: {
        $avg: "$value"
      },
      aggregates: {
        $push: {
          year: "$_id.year",
          value: "$value",
          months: "$months"
        }
      }
    }
  },
  {
    $project: {
      _id: 0
    }
  }
])

您可以在多个字段上分组;在本例中,“年”、“月”等。如何对它们进行嵌套分组?
{$group:{{id:{“年”:“$year”,“month”:“$month”,…},平均:{……
我希望年只包含当年的月份,而月份只包含当月的天数,依此类推。2020“[{”04:[{”07:[{“21”:{},{“19”:{}]}]。不一定要将它们作为键。它可以是键-值对。您能否编辑您的帖子并添加输出文档的外观示例。是的,您能否解释一下该值与平均值的相同程度。@GhazanfarKhan如果您一步一步地执行聚合,您可以看到我们是如何构造结构的。AVG是计算的通常,要用MongoDB聚合构建这样的结构,我们需要从底部->顶部开始。