On this page
通过设置 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
字段上创建索引,并指定3600
的expireAfterSeconds
值,以将到期时间设置为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
集合中删除文档。
See also
$currentDate operator
在特定的时钟时间使文档过期
要使文档在特定的时钟时间到期,请首先在一个字段上创建 TTL 索引,该字段包含 BSON 日期类型的值或 BSON 日期类型的对象的数组*,并且*将expireAfterSeconds
值指定为0
。对于集合中的每个文档,将索引日期字段设置为与文档到期时间相对应的值。如果索引日期字段包含过去的日期,则 MongoDB 认为文档已过期。
例如,以下操作在log_events
集合的expireAt
字段上创建索引,并指定0
的expireAfterSeconds
值:
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
值过期。