2016-05-29 3 views
1

Я разрабатываю приложение, которое собирает данные от датчиков, и мне нужно уменьшить объем данных, хранящихся в базе данных mongodb, используя значение (температуру) и дата (временная метка).Удалите избыточные данные с датчиков с использованием даты и значения

Документ имеет следующий формат:

{ 
temperature: 10, 
timestamp: ISODate("2016-04-29T14:37:50.370Z") 
sensorCode:"SENSOR_A1" 
} 

Проблема заключается в том, что датчики посылать данные слишком часто, так что слишком много документов с redudant данных в течение короткого периода времени (скажем, 10 минут). Я имел в виду, что не очень полезно иметь несколько равных значений за очень короткий промежуток времени. Пример: здесь есть данные от датчика, который имеет температуру отчетности 10

// collection: datasensors 
    [ 
    { 
    temperature: 10, 
    timestamp: ISODate("2016-04-29T14:37:50.370Z") 
    sensorCode:"SENSOR_A1" 
    }, 
    { 
    temperature: 10, 
    timestamp: ISODate("2016-04-29T14:38:50.555Z") 
    sensorCode:"SENSOR_A1" 
    }, 
    { 
    temperature: 10, 
    timestamp: ISODate("2016-04-29T14:38:51.654Z") 
    sensorCode:"SENSOR_A1" 
    } 
    , 
    { 
    temperature: 10, 
    timestamp: ISODate("2016-04-29T14:50:20.335Z") 
    sensorCode:"SENSOR_A1" 
    } 
    ] 

Поскольку минуту Precission не требуется, хотелось бы, чтобы удалить все документы из 2016-04-29T14: 37: 50.370Z к 2016-04-29T14: 38: 51.32Z за исключением одного. Так результат должен быть этот:

[ 
    { 
    temperature: 10, 
    timestamp: ISODate("2016-04-29T14:38:51.654Z") 
    sensorCode:"SENSOR_A1" 
    }, 
    { 
    temperature: 10, 
    timestamp: ISODate("2016-04-29T14:50:20.335Z") 
    sensorCode:"SENSOR_A1" 
    } 
    ] 

операции удаления Я хочу, чтобы выполнить должны «уменьшить» равные температуры во времени в диапазоне менее чем за 10 минут до одного значения.

Есть ли какая-либо техника для достижения этой цели?

ответ

0

Я упростил свое решение и решил сохранить каждое уникальное измерение, полученное в 10-минутном временном окне.
Монго 3.2 требуется для этого

  1. добавления метки времени будет отдельными измерения в 10 минут групп
  2. Тогда мы сохраняем первую запись в группе и хранении всех идентификаторов Для подробного процесса
  3. Затем удаление идентификатора документа мы хотим, чтобы из массива всех идентификаторов (скажем документы для удаления)
  4. Наконец, как петля Foreach мы удалялись не нужно ид - это линия комментируется :-)

Скопируйте приведенный ниже код в консоль mongo, выполните и проверьте идентификаторы для удаления, затем не комментируйте и зайдите!

var addTimeMark = { 
    $project : { 
     _id : 1, 
     temperature : 1, 
     timestamp : 1, 
     sensorCode : 1, 
     yearMonthDay : { 
      $substr : [{ 
        $dateToString : { 
         format : "%Y%m%d%H%M", 
         date : "$timestamp" 
        } 
       }, 0, 11] 
     } 
    } 
} 

var getFirstRecordInGroup = { 
    // take only first record froum group 
    $group : { 
     _id : { 
      timeMark : "$yearMonthDay", 
      sensorCode : "$sensorCode", 
      temperature : "$temperature" 
     }, 
     id : { 
      $first : "$_id" 
     }, 
     allIds : { 
      $push : "$_id" 
     }, 
     timestamp : { 
      $first : "$timestamp" 
     }, 
     totalEntries : { 
      $sum : 1 
     } 
    } 
} 

var removeFirstIdFromAllIds = { 
    $project : { 
     _id : 1, 
     id : 1, 
     timestamp : 1, 
     totalEntries : 1, 
     allIds : { 
      $filter : { 
       input : "$allIds", 
       as : "item", 
       cond : { 
        $ne : ["$$item", "$id"] 
       } 
      } 
     } 
    } 
} 

db.sensor.aggregate([ 
     addTimeMark, 
     getFirstRecordInGroup, 
     removeFirstIdFromAllIds, 
    ]).forEach(function (entry) { 
    printjson(entry.allIds); 
    // db.sensor.deleteMany({_id:{$in:entry.allIds}}) 
}) 

ниже перспективы документа после каждого шага:

{ 
    "_id" : ObjectId("574b5d8e0ac96f88db507209"), 
    "temperature" : 10, 
    "timestamp" : ISODate("2016-04-29T14:37:50.370Z"), 
    "sensorCode" : "SENSOR_A1", 
    "yearMonthDay" : "20160429143" 

} 

2:

{ 
    "_id" : { 
     "timeMark" : "20160429143", 
     "sensorCode" : "SENSOR_A1", 
     "temperature" : 10 
    }, 
    "id" : ObjectId("574b5d8e0ac96f88db507209"), 
    "allIds" : [ 
     ObjectId("574b5d8e0ac96f88db507209"), 
     ObjectId("574b5d8e0ac96f88db50720a"), 
     ObjectId("574b5d8e0ac96f88db50720b") 
    ], 
    "timestamp" : ISODate("2016-04-29T14:37:50.370Z"), 
    "totalEntries" : 3 
} 

и в прошлом;

{ 
    "_id" : { 
     "timeMark" : "20160429143", 
     "sensorCode" : "SENSOR_A1", 
     "temperature" : 10 
    }, 
    "id" : ObjectId("574b5d8e0ac96f88db507209"), 
    "allIds" : [ 
     ObjectId("574b5d8e0ac96f88db50720a"), 
     ObjectId("574b5d8e0ac96f88db50720b") 
    ], 
    "timestamp" : ISODate("2016-04-29T14:37:50.370Z"), 
    "totalEntries" : 3 
} 
Смежные вопросы