我有很多设备非定期将数据插入mongo。
我需要获得这些数据的统计数据(按日/月/年的值)。目前我通过添加一个字段来执行此操作,我使用$month
,$year
,$dayOfMonth
将日期解析为日期月份和年份。然后按这些值对它们进行分组。问题是我每天都没有(或只有一个)数据。然后我不能在这一天获得实际价值,因为我需要减去2个值。
有没有办法让白天最近的文件到这个组?在一个查询?
假设我有数据:
{id : 1, ts : "2017-12-15T10:00:00.000Z", value : 10}
{id : 2, ts : "2017-12-15T17:00:00.000Z", value : 10}
{id : 2, ts : "2017-12-14T12:00:00.000Z", value : 6}
{id : 1, ts : "2017-12-14T15:00:00.000Z", value : 10}
{id : 1, ts : "2017-12-14T10:00:00.000Z", value : 10}
{id : 2, ts : "2017-12-14T09:00:00.000Z", value : 3}
问题说明:
该值是从仪表实际读取的,例如,假设消耗的能量。如果设备在1分钟后出现4W / min,那么2分钟后它将是4,因此1.和2.分钟之间的差值为4。如果我有来自2017-12-14T23:58:00.000Z
的记录,请说 10W 23:59 它将 14W 所以dValue应为4且 00:00 第二天我无法计算dValue,因为这是该组中的第一个也是唯一一个记录
如果我按天分组这些数据,我只能在2017-12-14
中计算差值。
目前我正在使用查询:
{
$addFields : {
month : {$month : "$ts"},
year : {$year : "$ts"},
day : {$dayOfMonth : "$ts"}
}
},
{
$group : {
_id : {
year : "$year",
month : "$month",
day : "$day",
id : "$id"
},
first : {$min : "$$ROOT"},
last : {$max : "$$ROOT"},
}
},
{
$addFields : {
dValue: {$subtract : [last.value, first.value]} //delta value
}
},
此查询有效,但仅限于一天中有多个文档。如果只有一个文档我无法获得准确的数据。我想在一个查询中执行此操作,因为我有很多这些设备,而且数量只会增加,如果我必须对每个设备进行查询,我会向数据库发送疯狂的查询数量。有办法解决这个问题吗?