TTL集合支持mongodb對存儲的數據進行失效時間設置,經過指定的時間段后、或在指定的時間點過期,集合自動被mongod清除。這一特性有利於對一些只需要保存一定時間的數據信息進行存儲,比如機器產生的事件數據、日志、會話信息等。
Mongodb使用TTL索引特性來實現TTL集合。TTL通過一個后台線程讀取索引中數據類型的值,然后清除過期的集合。
集合中的文檔超過expireAfterSeconds關鍵字定義的時間后,該文檔就變得過期了,會被自動刪除。在創建TTL索引的時候,需要使用到關鍵字expireAfterSeconds,索引中對應的field的值的類型必須是date,或者對應的array包含date類型的值。
只能對單列索引創建TTL索引,組合索引不能是TTL索引。
1.經過指定的時間間隔后,集合失效
> db.log_events.createIndex({"createdAt": 1},{expireAfterSeconds: 180}) #5分鍾后過期 #插入文檔 > db.log_events.insert({ "createdAt": new Date(), "logEvent": 2, "logMessage": "Success!" }) #查看 > db.log_events.find() { "_id" : ObjectId("56e219ecf694a8d2cff60cca"), "createdAt" : ISODate("2016-03-11T01:05:48.082Z"), "logEvent" : 2, "logMessage" : "Success!" } #5分鍾后再次查看(已被清除) > db.log_events.find() >
2.指定時間點過期
將參數expireAfterSeconds設置為0,expireAt指定過期時間
> db.ttl.createIndex({"expireAt": 1},{expireAfterSeconds:0}) #插入文檔 > db.ttl.insert({ "createdAt": new Date('Mar 11, 2016 09:30:00'), "logEvent": 2, "logMessage": "Success!" })
使用TTL時是有限制的:
-如果要索引的字段已經在其他索引中使用,不能創建TTL索引
-索引不能包含多個字段
-如果定義的字段不存在,則永不過期
-不能對capped集合創建TTL索引