在一個保存report記錄的場景中,我們使用MongoDB進行數據存儲
example:
db: report
Collection: daily_report
創建db: use report;
創建集合: db.createCollection("daily_report")
我們的服務會根據用戶配置進行每天N次自動的任務的執行,每個任務結束后會對應生成一個report, 我們將report存儲於daily_report集合中。
插入一條記錄: db.daily_report.insert({task_id:1,user:'zhangsan',result:‘SUCCESS’}) # 比如有這三個字段
隨着時間的增長,數據量也越來越多,但是實際上report在月底進行數據分析產生月報后就沒有什么存在的意義了,但是mongo中daily_report的大小卻在持續增長,占用了磁盤空間,我們只希望保存一定量的數據,讓老舊的數據自動刪除掉,其實可以通過代碼來實現,思路就是每次插入前刪除31天前的數據,或者根據task_id刪除數據,只保留最近10000條記錄,實際上並不需要這么做,因為Mongodb已經考慮到了這種情景,並提供了解決方式:
我們上面只是創建了一個普通的集合,其實我們可以使用固定集合(Capped Collection)
MongoDB 固定集合(Capped Collections)是性能出色且有着固定大小的集合,對於大小固定,我們可以想象其就像一個環形隊列,當集合空間用完后,再插入的元素就會覆蓋最初始的頭部的元素!
如圖:
創建一個固定集合,最大保存10000條記錄:
db.createCollection("daily_report",{capped:true,size:10000,max:10000})
capped:true 表示為一個固定的集合
size 是整個集合空間大小,單位為【KB】
max 是集合文檔個數上線,單位是【個】
將存在的集合轉為固定文檔:
db.runCommand({"convertToCapped":"daily_report",max:10000})