MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

MongoDB:अपूर्ण डेटा के साथ समय-श्रृंखला कैसे पूछें?

मेरी पहली टिप्पणी में मैंने जिस दृष्टिकोण का उल्लेख किया था, उसके साथ यहां एकत्रीकरण है:

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()

निम्नलिखित इनपुट दस्तावेज़ों का उपयोग करना :

{"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") }

परिणाम :

{
        "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. $ लुकअप के लिए मोंगोडब कुल तर्क स्ट्रिंग होना चाहिए

  2. मोंगोइड रेल के माध्यम से मोंगोडब स्क्रिप्ट निष्पादित करना

  3. बहु-दस्तावेज़ लेनदेन में नाम स्थान नहीं बना सकता (MongoDB 4.0, स्प्रिंग डेटा 2.1.0, स्प्रिंग बूट)

  4. MongoDB में किसी विशेष फ़ील्ड मान वाला दस्तावेज़ नहीं रखने वाले सरणियों वाले दस्तावेज़ खोजें

  5. संग्रह को छानने के लिए बेहतर पैटर्न