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

MongoDB:Làm thế nào để truy vấn một chuỗi thời gian với dữ liệu không đầy đủ?

Đây là tổng hợp với cách tiếp cận mà tôi đã đề cập trong nhận xét đầu tiên của mình:

db.collection.aggregate( [
  { 
      $sort: { timestamp: 1 } 
  },
  { 
      $group: { 
           _id: null,
           docs: { $push: { timestamp: "$timestamp", device_id: "$device_id", temp: "$temp", missing: false } },
           device_id: { $first: "$device_id" },
           start: { $first: { $toInt: { $divide: [ { "$toLong": "$timestamp" }, 1000 ] } } }, 
           end: { $last: { $toInt: { $divide: [ { "$toLong": "$timestamp" }, 1000 ] } } }
      } 
  },
  { 
      $addFields: {
           docs: {
               $map: {
                    input: { $range: [ { $toInt: "$start" }, { $add: [ { $toInt: "$end" }, 900 ] }, 900 ] }, 
                    as: "ts",
                    in: {
                        ts_exists: { $arrayElemAt: [ 
                                              { $filter: { 
                                                      input: "$docs", as: "d", 
                                                      cond: { $eq: [ { $toInt: { $divide: [ { "$toLong": "$$d.timestamp" }, 1000 ] } },
                                                                      "$$ts"
                                                             ] }
                                               }}, 
                                     0 ] },
                         ts: "$$ts"
                    }
              }
          }
      }
  },
  { 
      $unwind: "$docs" 
  },
  { 
      $addFields: { 
          docs: { 
              $ifNull: [ "$docs.ts_exists", { timestamp: { $toDate: { $multiply: [ "$docs.ts", 1000 ] } }, 
                                              temp: 0, device_id: "$device_id", missing: true 
                                             } 
                       ] 
          }
      }
  },
  { 
      $replaceRoot: { newRoot: "$docs" } 
  }
] ).pretty()

Sử dụng tài liệu đầu vào sau :

{"device_id": "ABC","temp": 12,"timestamp": ISODate("2020-01-04T17:45:00.000+00:00") },
{"device_id": "ABC","temp": 10,"timestamp": ISODate("2020-01-04T18:00:00.000+00:00") },
{"device_id": "ABC","temp": 4,"timestamp": ISODate("2020-01-04T18:30:00.000+00:00") },
{"device_id": "ABC","temp": 23,"timestamp": ISODate("2020-01-04T18:45:00.000+00:00") }

Kết quả :

{
        "timestamp" : ISODate("2020-01-04T17:45:00Z"),
        "device_id" : "ABC",
        "temp" : 12,
        "missing" : false
}
{
        "timestamp" : ISODate("2020-01-04T18:00:00Z"),
        "device_id" : "ABC",
        "temp" : 10,
        "missing" : false
}
{
        "timestamp" : ISODate("2020-01-04T18:15:00Z"),
        "temp" : 0,
        "device_id" : "ABC",
        "missing" : true
}
{
        "timestamp" : ISODate("2020-01-04T18:30:00Z"),
        "device_id" : "ABC",
        "temp" : 4,
        "missing" : false
}
{
        "timestamp" : ISODate("2020-01-04T18:45:00Z"),
        "device_id" : "ABC",
        "temp" : 23,
        "missing" : false
}



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB &Meteor - Truy vấn đẩy vào mảng lồng nhau không hoạt động, không xảy ra lỗi

  2. Không thể khởi động lại mongodb trên Ubuntu 11.04

  3. Phần tử cập nhật Node.js trong MongoDB

  4. Kích thước tệp MongoDB GridFS rất lớn cho tệp tương đối nhỏ

  5. trường _id tùy chỉnh Django MongoDB MongoEngine