sql >> Database teknologi >  >> NoSQL >> MongoDB

Gensample tidsseriedata ved hjælp af Javascript og Mongodb

Det er sådan set muligt. Husk, at Pandas er et bibliotek bygget eksplicit til den slags opgaver, og et udyr på det, mens MongoDB er beregnet til at være en database. Men chancerne er store for, at følgende vil passe til dine behov, hvis man ignorerer dit sandsynlige behov for at bruge interpolation:

Forudsat at du har følgende data gemt i en MongoDB-samling ved navn 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...

som i dette tilfælde udtages omkring hvert 15. sekund, men det kunne lige så godt være uregelmæssigt. Hvis du vil gensample det til en 5-minutters grænse for en bestemt dag, skal du gøre følgende:

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}}
])

Dette vil resultere i noget som dette

{
    "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
        },
        ...

Hvis du vil kassere det samlede indgående, så skal du bare udelade linjen i $projektstadiet. Incoming_average er blot et eksempel på, hvordan man beregner gennemsnittet, hvis dine lagrede data er noget i stil med det, rrdtool navngiver en måler (temperatur, cpu, sensordata). Hvis du kun er ude efter summen aggregeret i det tidsinterval, det vil sige det indgående og udgående felt, så kan du lade hele $projektfasen ude. Den er kun til for at beregne gennemsnittet af tidsintervallet.

Se Mongo-sammenlægning af ISODate i 45 minutters bidder




  1. MongoDB Compass problem med WSL2

  2. Asynkron cursor iteration med asynkron underopgave

  3. Sidekiq behandler ikke kø

  4. Hvorfor får jeg et uigenkendt argument til dateFromString:'format' på trods af at jeg har db-version>3.6, som understøtter aggregeringen