У меня есть коллекция в mongoDB, которая отправляет информацию о сигналах, отправляемую с машин каждые N минут.Каждый документ в коллекции имеет код устройства SN и массив событий, который соответствует следующему формату:
{
"Device_SN": "ABCDE",
"Event": [{
"Code": 200,
"DTTM": ISODate("2018-08-21T15:46:50Z")
},
{
"Code": 215,
"DTTM": ISODate("2018-08-21T15:46:50Z")
}
]
}
Теперь мне нужно обобщить всю историю событий для каждого устройства в определенном временном диапазоне.Вывод результата моего запроса должен включать device_sn, код события, время начала события, время окончания события и продолжительность времени в табличном формате.Для этого сначала нужно отсортировать по Event.DTTM, а затем сгруппировать последовательные события с одним и тем же кодом события (или массивом кода события).Я предполагаю, что потребуется дополнительная переменная X, которая, например, увеличивается всякий раз, когда код события изменяется во временном интервале и далее группируется по этой переменной.
Мой запрос выглядит следующим образом:
db.event.aggregate( [
{ $unwind: "$Event"},
{ $match: { "Event.DTTM":{$gte:ISODate("2019-01-21T08:00:00Z"), $lt:ISODate("2019-01-21T20:00:00Z")} } },
{ $group: { _id:{dsn:"$Device_SN", Code:"$Event.Code"}, dsn:{$first:"$Device_SN"}, Event_Code:{$first:"$Event.Code"}, count:{$sum:1}, event_start_time:{$min:"$Event.DTTM"}, event_end_time:{$max:"$Event.DTTM"} } },
{ $sort: { _id:1, start_time:1}}
])
Однако, это не тот результат, который я хочу.Событие следует сгруппировать после изменения кода события во временном ряду.Кроме того, (end_time
) события должно быть временем, в которое изменяется код события.
Я новичок в MongoDB.Может ли кто-нибудь дать мне правильное утверждение запроса.Любая помощь приветствуется.Большое спасибо.