1. 程式人生 > 資料庫 >MongoDB TTL索引的例項詳解

MongoDB TTL索引的例項詳解

MongoDB TTL索引的例項詳解

TTL索引是一種特殊型別的單欄位索引,主要用於當滿足某個特定時間之後自動刪除相應的文件。也就是說集合中的文件有一定的有效期,超過有效期的文件就會失效,會被移除。也即是資料會過期。過期的資料無需保留,這種情形適用於如機器生成的事件資料,日誌和會話資訊等等。本文主要描述TTL索引的使用。

一、TTL索引

建立方法
    db.collection.createIndex(keys,options)
    options:
        expireAfterSeconds 指定多少秒或者包含日期值的陣列

建立示例
    db.eventlog.createIndex( { "lastModifiedDate": 1 },{ expireAfterSeconds: 3600 } ) 

何時失效
    在指定的時間達到後失效,也即是索引欄位的值加上一個特定的秒數之後
    如果索引欄位是一個數組,即索引欄位上存在著多個日期值,此時MongoDB取最小值加上失效時間(lowest())
    對於非日期欄位或不包含日期陣列的索引欄位,文件不會失效
    對於不包含索引欄位的文件,文件不會失效

刪除操作
    mongod的一個後臺執行緒會讀取索引的值並將失效的文件從集合移除
    當TTL執行緒被啟用後,可以從db.currentOp()或者從profile觀察到刪除操作

何時刪除
    當基於後臺方式建立索引時,TTL執行緒能夠在索引建立期間開始刪除失效文件
    當基於前臺方式建立索引時,TTL執行緒在索引建立完成後開始刪除失效文件   
    TTL索引的刪除不能完全保證失效期後一定刪除,存在一定延遲(取決於mongod的工作負載)
    TTL刪除文件後臺執行緒每60s移除失效文件(因此可能存在已過失效期,文件還在的情形)
    在副本集環境中,TTL後臺執行緒僅僅在主副本上工作,輔助副本上由複製操作實現
    在使用TTL索引查詢時,與使用非TTL索引一樣

一些限制
    不能基於已經存在索引的欄位建立TTL索引以及非日期欄位建立TTL索引,文件不會失效
    TTL索引不支援基於多個欄位的複合索引
    不支援定長集合

二、TTL索引示例

# mongo --shell localhost:27000 TTLData.js 
MongoDB shell version: 3.2.11
connecting to: localhost:27000/test

repSetTest:PRIMARY> addTTLTestData() //新增集合資料
Create three records in database each with a create time that is 1 minute apart
Created three test documents,oldest being 4 mins old
Now create a TTL index with expiry of 5 mins on the createDate field as follows
db.ttlTest.ensureIndex({createDate:1},{expireAfterSeconds:300})

repSetTest:PRIMARY> db.ttlTest.find()  //當前向集合裡插入了3個文件
{ "_id" : 1,"createDate" : ISODate("2017-03-10T03:23:01.169Z") }
{ "_id" : 2,"createDate" : ISODate("2017-03-10T03:24:01.169Z") }
{ "_id" : 3,"createDate" : ISODate("2017-03-10T03:25:01.169Z") }

//下面為測試集合上的文件新增索引,即5分鐘後索引失效
repSetTest:PRIMARY> db.ttlTest.createIndex({createDate:1},{expireAfterSeconds:300})
{
    "createdCollectionAutomatically" : false,"numIndexesBefore" : 1,// Author : Leshami
    "numIndexesAfter" : 2,// Blog  : http://blog.csdn.net/leshami
    "ok" : 1
}

//查詢文件
repSetTest:PRIMARY> db.ttlTest.find()
{ "_id" : 1,"createDate" : ISODate("2017-03-10T03:25:01.169Z") }

//當指定時間到期後,文件被刪除,如下,查詢不到任何文件
repSetTest:PRIMARY> db.ttlTest.find()

如有疑問請留言或者到本站社群交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支援!