Вложенная агрегация MongoDB на основе значений времени - PullRequest
0 голосов
/ 09 апреля 2020

У меня есть такая структура, исходящая от сенсорного устройства IOT

[{
    "_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: '' }
                                ]
                            }
                        ]
                    }
                ]
            }

        ]
    }
]

Я могу создать одну группу $ level, а затем pu sh the $$ ROOT в нем, но не знаю, как go вложиться в группы. Должен ли я использовать уменьшить логи c или любой.

Нужна помощь

1 Ответ

1 голос
/ 09 апреля 2020

Проверьте, соответствует ли решение вашим требованиям:

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
    }
  }
])

MongoPlayground

...