天天看點

statpot:使用mongo+bootstrap+highcharts做統計報表需求實作statpot工具問題記錄

最近做了一個統計項目,這個統計項目大緻的需求是統計接口的通路速度。用戶端會調用一個接口來記錄接口的通路情況,我的需求就需要分析這些資料,然後做出個統計報表。

最初的時候想着每天把這些接口通路情況的資訊存儲到mysql中,然後根據這些通路情況做個分析再做報表。然後第一個問題就來了,資訊包含太多字段了,如果我将每個資訊解析成mysql表的一個字段,那麼這個字段很長,而且還有一個緻命缺陷,不容易擴充。如果将所有字段都存儲為一個json,然後存儲到text字段呢,又沒法建立索引了。是以這種情況,最适合搬出mongo來了。

相比于mysql,mongo的好處就是擴充性好,靈活。像統計資料這樣很容易需求不确定的資料确實是個很好的選擇。我另外想想還有個好處就是不用的資料我可以很友善地将資料json化,然後存為檔案。然後在需要的時候,也很容易讀取直接放入到mongo中去。比如我可以将一個月的資料做一個持久備份之類的操作。

後續呢,由于後面有很多統計變化的需求。每次都寫一個過程來生成js代碼進而渲染統計報表也是個很繁瑣的事情。于是我就打算寫一個工具,大緻的思路就是依靠修改配置檔案就可以直接生成統計報表,報表的頁面為了美觀我引入了bootstrap 3.0。于是發現這種資料存儲mongo,加上配置檔案生成報表的模式是很容易實作,也确實很好使用。甚至于你在mongo中增加了一種統計結構,我可以什麼都不用修改,隻需要增加一個配置項就可以生成新統計結構的圖表了,這大都是歸功于mongo的json結構化。

這個工具statpot開源在github上了:

<a href="https://github.com/jianfengye/statpot">https://github.com/jianfengye/statpot</a>

可以下載下傳result/stat_20130925.html來看生成的報表。

生成的報表如下:

statpot:使用mongo+bootstrap+highcharts做統計報表需求實作statpot工具問題記錄

現在是實作了兩種:餅圖和柱狀圖。後續有可能的話還會繼續加上一些其他統計圖表。

還能想到的一個問題是這個頁面如果是動态的,那麼必然實時分析需要的時間比較多,而統計報表一般不需要動态的,是以完全可以做成生成靜态檔案的方式,于是web/目錄下就有動态和靜态的入口。這種生成靜态報表然後存儲的方式也是很好的,比如每天我生成一次動态報表,然後就把mongo中的資料清空或這靜态檔案化。

當然後來想想,這種唯配置至上的工具唯一的弊端是配置本身就是一種學習成本,你需要花時間來掌握這個配置。但是這個問題在我看來,和代碼一樣,應該由配置的語義來解決。

記錄下開發過程中特别是使用mongo中遇到的問題:

使用distinct

statpot:使用mongo+bootstrap+highcharts做統計報表需求實作statpot工具問題記錄

如何擷取一個字段的所有可能的值,并且計算出每個值有多少個條目

&gt; db.feedbacks.group({

     "key" : {"keys.properties.network_type": true},

     "initial":{"count":0}, 

     "$reduce":function(cur,prev){

            prev.count=prev.count+1;

     }

})