2017-02-16 58 views
0

我正在使用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查詢和過濾功能,並想尋求建議:

  1. 我的方法是在一個單一的文件中存儲多個指標合理嗎?我會更好地將度量標準保存爲單個文檔,然後以某種方式「合併」它們嗎?
  2. 有沒有一種方法可以實現我所需要的,而無需使用nodejs進行此操作(我認爲這不會是非常快速的事情 - 抓取文檔,然後迭代它們以創建新的結構並推出它)?
  3. 有沒有更好的方法來做到這一點?虛擬模型或其他可以幫助貓鼬的東西?據我所知,mongoDB可能不是時間序列數據的正確選擇,但它不是功能的唯一部分,mongoDB/mongoose組合似乎很好地服務於其他目的,我不想在技術中途改變技術。

回答

0
  1. 是的,但請記住,文檔具有有限的大小(16 MB IIRC),所以如果你的數據是無界的,這種結構不會因爲你的「指標」陣列將增長過去那種工作。

  2. 最終是的,即使你不能找出一個體面的過濾器查詢,Mongo有MapReduce,它可以讓你做你想做的事情,儘管它不會很容易。我會爲此使用節點。

  3. 這裏沒有銀彈。如果您需要彙總數據並將其存儲爲任意JSON(即由應用程序使用),並且不擅長執行復雜的數據聯接/視圖,則Mongo非常出色。應用程序級別的任何連接都會很慢。如果你想要表現,你必須將你的報告彙總成單個文件,並且保存&爲他們服務。如果你有實時數據,這將會更加困難,因爲你需要處理更新。

+0

是否有意義單獨存儲單個metricReports而不是將它們捆綁爲數組?比方說,目前,度量報告是一個項目的單一日期標準幻燈片(假設有5個度量標準被捆綁在一起),如果我單獨存儲它們,我將有5個單獨的文檔(每個度量標準1個),但這似乎更容易過濾和減少。將這些文件捆綁成切片會稍微複雜一點,但從原子構建似乎比將複雜結構分解成磚更容易。 – abolotnov

+0

當然,你可以做到這一點,無論你認爲對你更好。如果在某些時候該結構不再有效,您可以對數據運行ETL以轉換爲其他格式。因爲你不需要擔心模式,所以在Mongo中稍後改變你的想法就容易多了。 –