2016-05-29 13 views
1

Ich entwickle eine Anwendung, die Daten von Sensoren sammelt und ich brauche reduzieren Sie die Menge der Daten, die in einer Mongodb-Datenbank mit einem Wert (Temperatur) gespeichert und ein Datum (Zeitstempel).Entfernen Sie redundante Daten von Sensoren mit Datum und Wert

Das Dokument haben folgendes Format:

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

Das Problem ist, dass die Sensoren Daten zu viel häufig gesendet, so gibt es zu viele Dokumente mit redudant Daten in kürzester Zeit (mal 10 Minuten sagen). Ich meinte, dass es nicht nützlich ist, mehrere gleiche Werte in einer sehr kurzen Zeitspanne zu haben. Beispiel: hier gibt es Daten von einem Sensor, der Temperatur berichtet, wird 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" 
    } 
    ] 

Da eine Minute precission nicht erforderlich ist, ich möchte alle Dokumente entfernen 2016-04-29T14: 37: 50.370Z zu 2016-04-29T14: 38: 51.32Z außer einem. So sollte das Ergebnis sein, dies:

[ 
    { 
    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" 
    } 
    ] 

Die Entfernungsoperation I durchführen möchte, sollte „reduzieren“ gleiche Temperaturen in Zeitbereichen weniger als 10 Minuten auf einen Wert.

Gibt es irgendeine Technik, um dies zu erreichen?

Antwort

0

Ich vereinfachte meine Lösung und entschied mich dafür, jede einzigartige Messung in 10 Minuten Zeitfenster zu erhalten.
Mongo 3.2 ist für diese Marke

  1. Hinzufügen einer Zeit, die benötigt werden Messungen in 10 Minuten Zeitgruppen trennen
  2. Dann ersten Datensatz in der Gruppe sind wir zu erhalten und alle IDs für weiteren Prozess
  3. dann Entfernen ID Speicherung des Dokuments wollen wir aus einem Array aller IDs halten (lassen Sie Dokumente sagen löschen)
  4. schließlich als foreach-Schleife löschen wir nicht benötigt ids - diese Zeile :-)
kommentiert wird

Kopieren Sie den Code unten in die mongo-Konsole, führen Sie die zu löschenden IDs aus und bestätigen Sie sie, und entfernen Sie den Kommentar und 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}}) 
}) 

unter Dokument Outlook nach jedem Schritt:

{ 
    "_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 
} 

und Last;

{ 
    "_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 
}