本章内容:
- 行为
- 限制条件
注意:
如果要删除文档以节省存储成本,请考虑使用MongoDB Atlas中的Online Archive。 Online Archive会将不经常访问的数据自动存档到完全托管的S3存储桶中,以实现经济高效的数据分层。
TTL (生存时间值)
TTL是 Time To Live的缩写,来源于计算机网络,指定IP包被路由器丢弃之前允许通过的最大网段数量。本文中指数据在数据库中的生存时间可以设置为有限的。(编者注)
TTL索引是特殊的单字段索引,MongoDB可使用TTL索引在一定时间后或在定时时间之后自动从集合中删除文档。数据过期对于某些类型的信息很有用,例如机器生成的事件数据,日志和会话信息,它们仅需要在数据库中保留有限的时间。
若要创建TTL索引,请在其值为日期或包含日期值的数组的字段上使用db.collection.createIndex()方法,并且设置expireAfterSeconds选项。
例如,要在eventlog集合的lastModifiedDate字段上创建TTL索引,请在mongo shell中使用以下操作:
db.eventlog.createIndex( { "lastModifiedDate": 1 }, { expireAfterSeconds: 3600 } )
一、行为
1.数据过期
从索引字段值(字段类型是日期,所以该字段值就是倒计时的起始时间)起经过指定的秒数后,TTL索引使文档过期;即,到期阈值是索引字段值加上指定的秒数。
如果字段是数组,并且索引中有多个日期值,则MongoDB使用数组中最低(即最早)的日期值来计算到期阈值。
如果文档中的索引字段不是日期或包含日期值的数组,则该文档不会过期。
如果文档没有索引字段,则该文档不会过期。
2.删除操作
mongod中的后台线程读取索引中的值,并从集合中删除过期的文档。
如果TTL线程处于活动状态,可以在db.currentOp()的输出或数据库分析器收集的数据中看到删除操作信息。
3.删除操作的时间
一旦索引在primary数据库上构建完成,MongoDB就开始删除过期的文档。有关索引构建过程的更多信息,请参见填充集合上的索引构建。
TTL索引不能保证过期的数据将在过期后立即删除。从文档过期时间到MongoDB删除过期文档之间可能会有一定的延迟。
删除过期文档的后台任务每60秒运行一次。结果,在文档到期时间和后台任务运行这个时间段内,文档仍旧可能会保留在集合中。
由于删除操作的持续时间取决于mongod实例的工作负载,因此过期数据的存在时间可能会超过后台任务两次运行的60秒时间间隔(也就是,由于mongod负载,过期数据一次执行未必删除完全,会有过期数据存在超过60秒)。
4.复本集中的删除
在副本集成员上,仅当成员处于primary状态时,TTL后台线程才会删除过期文档。当成员处于secondary状态时,TTL背景线程处于空闲状态。secondary成员从primary成员复制删除操作。
5.对查询的支持
TTL索引对查询的支持,与非TTL索引一样。
二、限制
- TTL索引是单字段索引。复合索引不支持TTL,并且会忽略expireAfterSeconds选项。
- _id字段不支持TTL索引。
- 不能在固定集合(capped collection)上创建TTL索引,因为MongoDB无法从固定集合中删除文档。
- 不能使用createIndex()更改现有索引的expireAfterSeconds的值。而是将collMod数据库命令与索引收集标志一起使用。否则,要更改现有索引的选项的值,必须首先删除索引并重新创建。
- 如果某个字段已经存在非TTL单字段索引,则无法在同一字段上创建TTL索引,因为无法创建具有相同密钥规格且仅选项不同的索引。要将非TTL单字段索引更改为TTL索引,必须首先删除该索引,然后重新创建索引并指定expireAfterSeconds选项。