MongoDB中的定時索引

MongoDB中存在一種索引,叫作TTL索引(time-to-live index,具備生命週期的索引),這種索引容許爲每個文檔設置一個超時時間。一個文檔達到預設置的老化程度後就會被刪除。 數據到期對於某些類型的信息很是有用,例如機器生成的事件數據,日誌和會話信息,這些信息只須要在數據庫中保存有限的時間。git

在createIndex中指定expireAfterSeconds選項就能夠建立一個TTL索引:github

// 超時時間爲24小時,默認是前臺運行,能夠經過background:true設置爲後臺模式
db.user_session.createIndex({"updated":1},{expireAfterSeconds:60*60*24});
複製代碼

這樣在updated字段上建立了一個TTL索引。若是一個文檔的updated字段存在而且它的值是日期類型,當服務器時間比文檔的updated字段的時間晚expireAfterSeconds秒時,文檔就會被刪除。mongodb

db.getCollection('user_session').insert(
  {
    _id: NumberInt(1),
    "updated":new Date(),
     username:'lisi'
  }
);
複製代碼

mongodb保存時間使用的UTC時間,在查詢出來的結果的時候會轉換爲GMT時間,因此你看到保存的時間和電腦時間相差8個小時(GMT+8) db.getCollection('user_session').find({updated:{$gt: new Date("2019-07-12 14:00:00")}}) 在查詢的時候可使用new Date()直接進行時間的比較,new Date傳入的參數是GMT時間數據庫

爲了防止活躍的會話被刪除,能夠在會話上有活動發生時將updated字段的值更新爲當前時間。只要updated的時間距離當前時間達到24小時。相應的文檔就會被刪除。bash

MongoDB的TTL功能依賴於mongodb中的後臺線程,該線程讀取索引中的日期類型值並從集合中刪除過時的文檔。 MongoDB每分鐘對TTL索引進行一次清理,因此不該該依賴以秒爲單位的時間保證索引的存活狀態。並且TTL索引不保證在到期時當即刪除過時數據。文檔到期的時間與MongoDB從數據庫中刪除文檔的時間之間可能存在延遲。因爲刪除過時文檔的後臺任務每60秒運行一次。因此,文檔可能在文檔到期和後臺任務運行之間的期間保留在集合中。服務器

源碼在 github.com/mongodb/mon…session

mongodb不支持使用createIndex來從新設置過時時間,只可使用collMod命令修改expireAfterSeconds的值:優化

db.runCommand({collMod:"user_session",index: {name:"updated_1",expireAfterSeconds: 120}});
複製代碼

修改爲功後,你會收到這樣的消息(以前的過時時間是一分鐘,如今修改成2分鐘)spa

{
    "expireAfterSeconds_old" : 60.0,
    "expireAfterSeconds_new" : 120.0,
    "ok" : 1.0
}

複製代碼

在一個給定的集合上能夠有多個TTL索引,你能夠在created和updated字段分別創建ttl索引,可是不能同時使用兩個字段創建複合ttl索引,也不能在同一個字段上又是建立TTL索引,又是建立普通索引,可是能夠像「普通索引」同樣用來優化排序和查詢。線程

相關文章
相關標籤/搜索