MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Lấy lại mẫu dữ liệu chuỗi thời gian sử dụng Javascript và Mongodb

Nó là loại có thể. Hãy nhớ rằng Pandas là một thư viện được xây dựng rõ ràng cho những loại nhiệm vụ đó và là một con quái thú trong đó, trong khi MongoDB có nghĩa là một cơ sở dữ liệu. Nhưng rất có thể những điều sau đây sẽ phù hợp với nhu cầu của bạn, nếu người ta bỏ qua nhu cầu có thể xảy ra của bạn về việc sử dụng phép nội suy:

Giả sử rằng bạn có dữ liệu sau được lưu trữ trong bộ sưu tập MongoDB có tên 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...

trong trường hợp này, được lấy mẫu khoảng 15 giây một lần, nhưng nó cũng có thể là bất thường. Nếu bạn muốn lấy mẫu lại thành ranh giới 5 phút cho một ngày nhất định, thì bạn nên làm như sau:

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

Điều này sẽ dẫn đến một cái gì đó như thế này

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

Nếu bạn muốn loại bỏ tổng số tiền gửi đến, thì chỉ cần bỏ dòng trong giai đoạn $ project. Incoming_average chỉ là một ví dụ về cách tính giá trị trung bình, trong trường hợp dữ liệu được lưu trữ của bạn giống như những gì rrdtool đặt tên cho một máy đo (nhiệt độ, cpu, dữ liệu cảm biến). Nếu bạn chỉ sau khi tổng được tổng hợp trong nghịch đảo thời gian đó, đó là trường đến và đi, thì bạn có thể bỏ qua toàn bộ giai đoạn dự án $. Nó chỉ ở đó để tính giá trị trung bình của khoảng thời gian.

Xem Mongo tổng hợp ISODate thành các phần 45 phút




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Cách sử dụng mongoose phân biệt, bỏ qua và giới hạn cùng nhau

  2. Triển khai MongoDB bằng Docker

  3. Jackson không thể deserialize đối tượng MongoDB được truyền qua REST

  4. MongoDb Aggregation:Làm cách nào để tôi có thể nhóm một mảng-1 dựa trên một mảng-2 khác khi cho mảng-1 và mảng-2?

  5. Không thể nhận các giá trị thuộc tính dirtyPropertyNames cho các trường liên kết trong grails