从组外

时间:2017-12-15 09:18:33

标签: mongodb aggregation-framework

我有很多设备非定期将数据插入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
   }
},

此查询有效,但仅限于一天中有多个文档。如果只有一个文档我无法获得准确的数据。我想在一个查询中执行此操作,因为我有很多这些设备,而且数量只会增加,如果我必须对每个设备进行查询,我会向数据库发送疯狂的查询数量。有办法解决这个问题吗?

0 个答案:

没有答案