2016-05-29 56 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. 然後我們保留在組第一記錄和存儲的所有ID獲得進一步的處理
  3. 然後去除ID的文件中,我們想從所有的ID陣列保持(讓說文件刪除)
  4. 最後爲forEach循環,我們刪除不需要的標識 - 這條線被註釋掉:-)

下面複製代碼蒙戈控制檯,執行和驗證ID來刪除,然後取消註釋和GO!

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 
}