TTL索引是一種特殊索引,通過這種索引MongoDB會自動重新設置集合的文檔。這對於某些類型的信息來說是一個很理想的特性,例如機器生成的事件數據,日誌,會話信息等,這些數據都只需要在數據庫中保存有限時間。
使用官方方式及網上很多提供方式,會以索引的方式進行時間到期自動刪除數據的方式。
環境:MongoDB v4.2.0
但是作者實際測試過後,發現透過索引方式好像只能限定最多3600秒以內。
如官方語法
1 |
db.eventlog.createIndex( { "expireAt": 1 }, { expireAfterSeconds: 3600 } ) |
Schema設定
1 2 3 4 5 |
expireAt: { type: Date, default: Date.now, index: { expires: '1d' } } |
這種方式發現index並非會自行建立,但是將expires設定於3600秒就會建立索引
最後作者只能使用以前看過一篇的技巧以function方式帶入,
express session connect mongo 也是直接將expires時間加上,
可參考此方式解決
1 2 3 4 5 6 |
expireAt: { type: Date, default: () => { return new Date(+new Date() + 7 * 24 * 60 * 60 * 1000 ) }, required: true, expires: 1 } |
以現在時間 增加 7 * 24 * 60 * 60 * 1000 (7天) 毫秒為單位。
到期後約 3~5分鐘 就自動消失,也不是馬上refresh就消失,
以上述到期算法大概會約 7天又五分鐘後消失,所以如果想要準確7天就消失可以自行減300,000毫秒