sql >> Database >  >> NoSQL >> MongoDB

Herbemonster tijdreeksgegevens met Javascript en Mongodb

Het is een beetje mogelijk. Houd er rekening mee dat Pandas een bibliotheek is die expliciet voor dat soort taken is gebouwd, en een beest is, terwijl MongoDB bedoeld is als een database. Maar de kans is groot dat het volgende aan uw behoeften voldoet, als u uw waarschijnlijke behoefte aan interpolatie negeert:

Ervan uitgaande dat u de volgende gegevens hebt opgeslagen in een MongoDB-verzameling met de naam devices

/* 0 */
{
    "_id" : ObjectId("543fc08ccf1e8c06c0288802"),
    "t" : ISODate("2014-10-20T14:56:44.097+02:00"),
    "a" : "192.168.0.16",
    "i" : 0,
    "o" : 32
}

/* 1 */
{
    "_id" : ObjectId("543fc08ccf1e8c06c0288803"),
    "t" : ISODate("2014-10-20T14:56:59.107+02:00"),
    "a" : "192.168.0.16",
    "i" : 14243,
    "o" : 8430
}

and so on...

die in dit geval om de 15 seconden wordt gesampled, maar het kan net zo goed onregelmatig zijn. Als u het voor een bepaalde dag opnieuw wilt samplen tot een grens van 5 minuten, moet u het volgende doen:

var low = ISODate("2014-10-23T00:00:00.000+02:00")
var high = ISODate("2014-10-24T00:00:00.000+02:00")
var interval = 5*60*1000;
db.devices.aggregate([
  {$match: {t:{$gte: low, $lt: high}, a:"192.168.0.16"}},
  {$group: {
     _id:{
       $subtract: ["$t", {
         $mod: [{
           $subtract: ["$t", low]
         }, interval]
       }]
     },
     total: {$sum: 1},
     incoming: {$sum: "$i"},
     outgoing: {$sum: "$o"},
    }
  },
  {
    $project: {
      total: true,
      incoming: true,
      outgoing: true,
      incoming_avg: {$divide: ["$incoming", "$total"]},
      outgoing_avg: {$divide: ["$outgoing", "$total"]},
    },
  },
  {$sort: {_id : 1}}
])

Dit resulteert in zoiets als dit

{
    "result" : [ 
        {
            "_id" : ISODate("2014-10-23T07:25:00.000+02:00"),
            "total" : 8,
            "incoming" : 11039108,
            "outgoing" : 404983,
            "incoming_avg" : 1379888.5,
            "outgoing_avg" : 50622.875
        }, 
        {
            "_id" : ISODate("2014-10-23T07:30:00.000+02:00"),
            "total" : 19,
            "incoming" : 187241,
            "outgoing" : 239912,
            "incoming_avg" : 9854.78947368421,
            "outgoing_avg" : 12626.94736842105
        }, 
        {
            "_id" : ISODate("2014-10-23T07:35:00.000+02:00"),
            "total" : 17,
            "incoming" : 22420099,
            "outgoing" : 1018766,
            "incoming_avg" : 1318829.352941176,
            "outgoing_avg" : 59927.41176470588
        },
        ...

Als u de totale inkomende wilt weggooien, laat dan de regel weg in de $project-fase. De inkomende_gemiddelde is slechts een voorbeeld van hoe het gemiddelde te berekenen, voor het geval uw opgeslagen gegevens zoiets zijn als wat rrdtool een meter noemt (temperatuur, cpu, sensorgegevens). Als u alleen uit bent op de som die is geaggregeerd in die tijdinverval, dat wil zeggen het inkomende en uitgaande veld, dan kunt u de hele $project-fase weglaten. Het is er alleen om het gemiddelde van het tijdsinterval te berekenen.

Zie Mongo-aggregatie van ISODate in blokken van 45 minuten




  1. Gegevensmigratie van Oracle naar Mongo DB

  2. MongoDB Opensource versus MongoDB Enterprise

  3. PHP MongoDB - Het gebruik van het aggregatiecommando zonder de cursoroptie is verouderd. Wat?

  4. mongoexport syntaxis foutmelding