我正在使用mongoDB和mongoose來存儲指標數據。它被存儲爲一個引用存儲的項目和度量標準類型的度量數組的文檔。彙總時間序列數據
這樣做的模式是這樣的:
exports.metricReportSchema = new Schema({
metrics: [{
metric: {
type: mongoose.Schema.Types.ObjectId,
ref: 'metricSchema',
required: true
},
value: {
type: String,
required: true
}
}],
project: {
type: mongoose.Schema.Types.ObjectId,
ref: 'projectSchema',
required: true
},
reportDate: Date
});
實際的文檔看起來如下:
db.metricreports.findOne() {
"_id" : ObjectId("58a60e8459dd3d12ef8c5d51"),
"reportDate" : ISODate("2017-02-16T20:41:40.657Z"),
"project" : ObjectId("58a20f5f04ef5789d3ef8faa"),
"metrics" : [
{
"metric" : ObjectId("58a20f5f04ef5789d3ef8fb7"),
"value" : "781",
"_id" : ObjectId("58a60e8459dd3d12ef8c5d52")
}, {
"metric" : ObjectId("58a21106fc2aef8a10ded196"),
"value" : "566",
"_id" : ObjectId("58a60e8459dd3d12ef8c5d53")
}, {
"metric" : ObjectId("58a2141bded78e8ad8384f97"),
"value" : "501",
"_id" : ObjectId("58a60e8459dd3d12ef8c5d54")
}, {
"metric" : ObjectId("58a2141bded78e8ad8384f94"),
"value" : "44",
"_id" : ObjectId("58a60e8459dd3d12ef8c5d55")
}, {
"metric" : ObjectId("58a2141bded78e8ad8384f93"),
"value" : "645",
"_id" : ObjectId("58a60e8459dd3d12ef8c5d56")
}
],
"__v" : 0
}
隨着時間的推移,有存儲數據的片這樣的多份文件多個指標。選擇和顯示關於多個項目的指標的靜態報告非常方便。
現在,當我嘗試爲項目的單個度量標準構建時間序列報表時,這變得並不複雜。
基本上,我需要做的是掃描多個MetricReport文檔,並隨時間從所有可用報告中提取單個單個Metric的數據。比方說,我有10個metricReports每個包含數據的10度不同的指標,我只想要提取一個,這很可能是這樣的:
{
"_id": "...",
"project": "...",
"metric": "...",
"data": {
"2016-02-02": "22",
"2016-02-03": "453",
...
}
}
我不能找到一種方法與失做到這一點box mongoDB查詢和過濾功能,並想尋求建議:
- 我的方法是在一個單一的文件中存儲多個指標合理嗎?我會更好地將度量標準保存爲單個文檔,然後以某種方式「合併」它們嗎?
- 有沒有一種方法可以實現我所需要的,而無需使用nodejs進行此操作(我認爲這不會是非常快速的事情 - 抓取文檔,然後迭代它們以創建新的結構並推出它)?
- 有沒有更好的方法來做到這一點?虛擬模型或其他可以幫助貓鼬的東西?據我所知,mongoDB可能不是時間序列數據的正確選擇,但它不是功能的唯一部分,mongoDB/mongoose組合似乎很好地服務於其他目的,我不想在技術中途改變技術。
是否有意義單獨存儲單個metricReports而不是將它們捆綁爲數組?比方說,目前,度量報告是一個項目的單一日期標準幻燈片(假設有5個度量標準被捆綁在一起),如果我單獨存儲它們,我將有5個單獨的文檔(每個度量標準1個),但這似乎更容易過濾和減少。將這些文件捆綁成切片會稍微複雜一點,但從原子構建似乎比將複雜結構分解成磚更容易。 – abolotnov
當然,你可以做到這一點,無論你認爲對你更好。如果在某些時候該結構不再有效,您可以對數據運行ETL以轉換爲其他格式。因爲你不需要擔心模式,所以在Mongo中稍後改變你的想法就容易多了。 –