本文為NoSQL數(shù)據(jù)模型設(shè)計(jì)系列的一部分魁衙。
mongodb內(nèi)部使用UTC時(shí)間空猜。應(yīng)用程序需要處理UTC時(shí)間到本地時(shí)間的轉(zhuǎn)換湾盗,例如
應(yīng)用程序同時(shí)保存時(shí)間和針對(duì)UTC的時(shí)區(qū)偏移量
var now = new Date();
db.data.save( { date: now,
offset: now.getTimezoneOffset() } );
讀取這兩個(gè)數(shù)據(jù)還原本地時(shí)間
var record = db.data.findOne();
var localNow = new Date( record.date.getTime() - ( record.offset * 60000 ) );
桶模式
它是一個(gè)處理時(shí)間序列數(shù)據(jù)的常用模式崇渗。將數(shù)據(jù)按照時(shí)間分組保存例如按照小時(shí)旋廷、天或者年分組泳唠。這樣做的好處是
- 發(fā)現(xiàn)歷史趨勢(shì)
- 預(yù)測(cè)未來(lái)趨勢(shì)
- 優(yōu)化存儲(chǔ)空間
考慮下面溫度數(shù)據(jù)狈网,它來(lái)自于每分鐘記錄一次的傳感器,并記錄在temperatures集合中
// temperatures collection
{
"_id": 1,
"sensor_id": 12345,
"timestamp": ISODate("2019-01-31T10:00:00.000Z"),
"temperature": 40
}
{
"_id": 2,
"sensor_id": 12345,
"timestamp": ISODate("2019-01-31T10:01:00.000Z"),
"temperature": 40
}
{
"_id": 3,
"sensor_id": 12345,
"timestamp": ISODate("2019-01-31T10:02:00.000Z"),
"temperature": 41
}
...
采用桶模式將數(shù)據(jù)按小時(shí)分組
{
"_id": 1,
"sensor_id": 12345,
"start_date": ISODate("2019-01-31T10:00:00.000Z"),
"end_date": ISODate("2019-01-31T10:59:59.000Z"),
"measurements": [
{
"timestamp": ISODate("2019-01-31T10:00:00.000Z"),
"temperature": 40
},
{
"timestamp": ISODate("2019-01-31T10:01:00.000Z"),
"temperature": 40
},
...
{
"timestamp": ISODate("2019-01-31T10:42:00.000Z"),
"temperature": 42
}
],
"transaction_count": 42,
"sum_temperature": 1783
}
新結(jié)構(gòu)便于用戶(hù)按照小時(shí)或者天查詢(xún)溫度笨腥。
同計(jì)算模式結(jié)合
上面新結(jié)構(gòu)中還包含兩個(gè)計(jì)算字段transaction_count和sum_temperature拓哺,它們方便用戶(hù)快速查詢(xún)匯總值,并能夠提供更多的計(jì)算值例如平均溫度sum_temperature/transaction_count脖母。
更多應(yīng)用
桶模式還可用于IOT應(yīng)用士鸥,按照設(shè)備或系統(tǒng)將數(shù)據(jù)分組。也可用戶(hù)金融應(yīng)用谆级,按照類(lèi)型烤礁、日期、客戶(hù)將交易數(shù)據(jù)分組哨苛。
完整內(nèi)容請(qǐng)查看NoSQL數(shù)據(jù)模型設(shè)計(jì)系列