sql >> データベース >  >> NoSQL >> MongoDB

JavascriptとMongodbを使用して時系列データをリサンプリングする

    それは一種の可能性です。 Pandasは、これらの種類のタスク用に明示的に構築されたライブラリであり、その獣であり、MongoDBはデータベースであることが意図されていることに注意してください。ただし、補間を使用する必要性を無視すると、次のものがニーズに合う可能性が高くなります。

    devicesという名前のMongoDBコレクションに次のデータが保存されていると仮定します

    /* 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...
    

    この場合、約15秒ごとにサンプリングされますが、不規則にサンプリングされることもあります。特定の日の5分の境界にリサンプリングする場合は、次の手順を実行する必要があります。

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

    これにより、次のようになります

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

    着信の合計を破棄する場合は、$projectステージでラインを除外します。格納されたデータがrrdtoolがゲージに指定したもの(温度、CPU、センサーデータ)のようなものである場合、incoming_averageは平均を計算する方法の単なる例です。その時間のインバーバルで集計された合計、つまり着信フィールドと発信フィールドの後でのみ、$projectステージ全体を除外できます。時間間隔の平均を計算するためだけにあります。

    ISODateの45分のチャンクへのMongo集約を参照してください




    1. Linqを介してMongoDBのBsonExtraElementsをクエリする方法

    2. Mongoose.jsサブドキュメント配列を取得できません

    3. MongodbfindAndModifyノードjs

    4. 日/月ごとにグループ化し、mongoでその日/月の評価の平均を取ります