我在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,例如,只要事件代码在时间序列中改变并进一步按该变量分组,该变量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的新手。谁能给我正确的查询语句。任何帮助表示赞赏。非常感谢你。