最近作了一個統計項目,這個統計項目大體的需求是統計接口的訪問速度。客戶端會調用一個接口來記錄接口的訪問狀況,個人需求就須要分析這些數據,而後作出個統計報表。php
最初的時候想着天天把這些接口訪問狀況的信息存儲到mysql中,而後根據這些訪問狀況作個分析再作報表。而後第一個問題就來了,信息包含太多字段了,若是我將每一個信息解析成mysql表的一個字段,那麼這個字段很長,並且還有一個致命缺陷,不容易擴展。若是將全部字段都存儲爲一個json,而後存儲到text字段呢,又無法創建索引了。因此這種狀況,最適合搬出mongo來了。css
相比於mysql,mongo的好處就是擴展性好,靈活。像統計數據這樣很容易需求不肯定的數據確實是個很好的選擇。我另外想一想還有個好處就是不用的數據我能夠很方便地將數據json化,而後存爲文件。而後在須要的時候,也很容易讀取直接放入到mongo中去。好比我能夠將一個月的數據作一個持久備份之類的操做。html
接着是生成統計報表的部分。各類圖是很須要的,因爲是給內部作統計報表,不須要兼顧各類瀏覽器。因此我選擇了強大的highCharts。highCharts是一個JS圖表庫。很方便的就能夠生成圖表了。親身體會是這個比flash作圖表開發時間縮短多了。你能夠從http://www.highcharts.com/上下載3.0版本。mysql
後續呢,因爲後面有不少統計變化的需求。每次都寫一個過程來生成js代碼從而渲染統計報表也是個很繁瑣的事情。因而我就打算寫一個工具,大體的思路就是依靠修改配置文件就能夠直接生成統計報表,報表的頁面爲了美觀我引入了bootstrap 3.0。因而發現這種數據存儲mongo,加上配置文件生成報表的模式是很容易實現,也確實很好使用。甚至於你在mongo中增長了一種統計結構,我能夠什麼都不用修改,只須要增長一個配置項就能夠生成新統計結構的圖表了,這大都是歸功於mongo的json結構化。git
這個工具statpot開源在github上了:github
https://github.com/jianfengye/statpotweb
能夠下載result/stat_20130925.html來看生成的報表。sql
生成的報表以下:mongodb
如今是實現了兩種:餅圖和柱狀圖。後續有可能的話還會繼續加上一些其餘統計圖表。json
還能想到的一個問題是這個頁面若是是動態的,那麼必然實時分析須要的時間比較多,而統計報表通常不須要動態的,因此徹底能夠作成生成靜態文件的方式,因而web/目錄下就有動態和靜態的入口。這種生成靜態報表而後存儲的方式也是很好的,好比天天我生成一次動態報表,而後就把mongo中的數據清空或這靜態文件化。
固然後來想一想,這種惟配置至上的工具惟一的弊端是配置自己就是一種學習成本,你須要花時間來掌握這個配置。可是這個問題在我看來,和代碼同樣,應該由配置的語義來解決。
記錄下開發過程當中特別是使用mongo中遇到的問題:
使用distinct
如何獲取一個字段的全部可能的值,而且計算出每一個值有多少個條目
group的命令文檔在:http://docs.mongodb.org/manual/reference/method/db.collection.group/
> db.feedbacks.group({
"key" : {"keys.properties.network_type": true},
"initial":{"count":0},
"$reduce":function(cur,prev){
prev.count=prev.count+1;
}
})
對應的PHP mongo的API是:http://www.php.net/manual/zh/mongocollection.group.php
http://www.cnblogs.com/huangxincheng/archive/2012/02/21/2361205.html
http://api.highcharts.com/highcharts