网站首页 文章专栏 mongodb的TTL索引之删除过期文档机制
本文章目前适用 mongodb:2.2 到 4.2
过期时间索引(TTL indexes )是一个只能在单字段上建立的索引. MongoDB可以使用它在一定时间(单体秒)内或指定时间后自动从集合中移除文档。. 数据过期对于某些类型的信息(如机器生成的事件数据、日志和会话信息)非常有用,这些信息只需要在数据库中保留有限的时间。
若要创建TTL索引,请对值为日期或包含日期值的数组的字段使用db.collection.createIndex()方法和 expireAfterSeconds 选项。
例如,要在eventlog集合的lastModifiedDate字段上创建TTL索引,请在mongo shell中使用以下操作:
数据过期
TTL索引在索引字段值之后的指定秒数之后使文档过期;即过期阈值是索引字段值加上指定秒数。
如果字段是数组,并且索引中有多个日期值,MongoDB使用数组中的最低(即最早)日期值来计算到期阈值。
如果文档中的索引字段不是日期或包含日期值的数组,则文档不会过期。
如果文档不包含索引字段,则文档不会过期。
mongod 会在后台启动一个TTL 线程每60秒运行一次,读取索引中的值,并从集合中删除过期的文档
当TTL线程处于活动状态时,可用db.currentOp()的输出或通过数据库探查器收集的数据中看到删除操作。
For feature compatibility version (fcv) "4.2", MongoDB在索引构建完成后立即开始删除过期的文档。.
For feature compatibility version (fcv) "4.0", 删除操作的时间取决于索引生成类型:
1.对于前台生成索引,MongoDB只能在生成完成后开始删除过期的文档。.
前台生成,或后台生成的区别在于,在使用createIndex() 方法时,是否加上background 选项. 比如后台生成索引:
db.people.createIndex( { zipcode: 1}, {background: true} )
关于更多创建索引的细节,请看集合的索引生成
TTL索引不能保证过期的数据在过期后立即被删除。从文档过期到MongoDB从数据库中删除文档之间可能存在延迟。
删除过期文档的后台任务每60秒运行一次。因此,在文档到期和后台任务运行之间的时间段内,文档可能会保留在集合中。
在副本集成员上,TTL后台线程仅在主成员上运行。辅助成员从主成员复制删除操作。
TTL索引与非TTL索引一样支持查询