MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Contoh Ulang Data Deret Waktu menggunakan Javascript dan Mongodb

Ini agak mungkin. Perlu diingat bahwa Pandas adalah perpustakaan yang dibangun secara eksplisit untuk tugas-tugas semacam itu, dan binatang buas dalam hal itu, sementara MongoDB dimaksudkan untuk menjadi database. Tetapi kemungkinan besar berikut ini akan sesuai dengan kebutuhan Anda, jika seseorang mengabaikan kemungkinan kebutuhan Anda untuk menggunakan interpolasi:

Dengan asumsi bahwa Anda memiliki data berikut yang disimpan dalam koleksi MongoDB bernama 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...

yang, dalam hal ini, diambil sampelnya sekitar setiap 15 detik, tetapi bisa juga tidak teratur. Jika Anda ingin sampel ulang ke batas 5 menit untuk hari tertentu, maka Anda harus melakukan hal berikut:

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

Ini akan menghasilkan sesuatu seperti ini

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

Jika Anda ingin membuang total yang masuk, maka tinggalkan saja baris di tahap $project. Incoming_average hanyalah contoh bagaimana menghitung rata-rata, jika data yang Anda simpan adalah sesuatu seperti apa yang rrdtool beri nama pengukur (suhu, cpu, data sensor). Jika Anda hanya mengejar jumlah yang dikumpulkan dalam inverval waktu itu, yaitu bidang masuk dan keluar, maka Anda dapat membiarkan seluruh tahapan $project keluar. Itu hanya ada untuk menghitung rata-rata interval waktu.

Lihat Agregasi Mongo dari ISODate menjadi potongan-potongan 45 menit




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Cara query dengan beberapa kondisi dan kondisi itu tergantung

  2. Tidak dapat membuat instance proxy... Tidak dapat menemukan konstruktor tanpa parameter

  3. Kesalahan saat membuat koleksi di MongoDB

  4. Hapus banyak dokumen dari mongo dalam satu kueri

  5. Transaksi Mongo DB 4.0 Dengan Mongoose &NodeJs, Express