通过设置 TTL 使集合中的数据过期

在本页面

本文档介绍了 MongoDB 的“ 生存时间”或TTL收集功能。 TTL 收集使在 MongoDB 中存储数据成为可能,并使mongod在指定的秒数或特定的时钟时间后自动删除数据。

数据到期对于某些类型的信息很有用,包括机器生成的事件数据,日志和会话信息,这些信息仅需要保留一段有限的时间。

特殊的TTL 索引属性支持 TTL 集合的实现。 TTL 功能依赖于mongod中的后台线程,该线程读取索引中日期类型的值并从集合中删除过期的documents

Procedures

若要创建TTL index,请在其值为date或包含date values的数组的字段上使用带有expireAfterSeconds选项的db.collection.createIndex()方法。

Note

TTL 索引是单个字段索引。复合索引不支持 TTL 属性。有关 TTL 索引的更多信息,请参见TTL Indexes

您可以使用collMod命令修改现有 TTL 索引的expireAfterSeconds

在指定的秒数后使文档过期

要在自索引字段起经过指定的秒数后使数据过期,请在保存 BSON 日期类型的值或 BSON 日期类型的对象数组的字段上创建 TTL 索引,并*在其中指定正非零值expireAfterSeconds字段。自从在其索引字段中指定的时间以来expireAfterSeconds字段中的秒数过去后,文档将过期。 [1]

例如,以下操作在log_events集合的createdAt字段上创建索引,并指定3600expireAfterSeconds值,以将到期时间设置为createdAt指定的时间之后的一小时。

db.log_events.createIndex( { "createdAt": 1 }, { expireAfterSeconds: 3600 } )

将文档添加到log_events集合时,请将createdAt字段设置为当前时间:

db.log_events.insert( {
   "createdAt": new Date(),
   "logEvent": 2,
   "logMessage": "Success!"
} )

当文档的createdAt[1]大于expireAfterSeconds中指定的秒数时,MongoDB 将自动从log_events集合中删除文档。

[1]*(12)*如果该字段包含一组 BSON 日期类型的对象,则至少一个 BSON 日期类型的对象的时间早于expireAfterSeconds中指定的秒数,数据就会过期。

See also

$currentDate operator

在特定的时钟时间使文档过期

要使文档在特定的时钟时间到期,请首先在一个字段上创建 TTL 索引,该字段包含 BSON 日期类型的值或 BSON 日期类型的对象的数组*,并且*将expireAfterSeconds值指定为0。对于集合中的每个文档,将索引日期字段设置为与文档到期时间相对应的值。如果索引日期字段包含过去的日期,则 MongoDB 认为文档已过期。

例如,以下操作在log_events集合的expireAt字段上创建索引,并指定0expireAfterSeconds值:

db.log_events.createIndex( { "expireAt": 1 }, { expireAfterSeconds: 0 } )

对于每个文档,将expireAt的值设置为对应于文档应过期的时间。例如,以下insert()操作添加了应在July 22, 2013 14:00:00到期的文档。

db.log_events.insert( {
   "expireAt": new Date('July 22, 2013 14:00:00'),
   "logEvent": 2,
   "logMessage": "Success!"
} )

当文档的expireAt值早于expireAfterSeconds中指定的秒数(即在这种情况下0秒)时,MongoDB 将自动从log_events集合中删除文档。这样,数据将以指定的expireAt值过期。