本章介绍MongoDB的“生存时间”或
TTL
集合的功能。 通过TTL集合可以实现:在MongoDB中存储数据并让
mongod
在指定的秒数后或特定的时钟时间后自动删除数据。
数据到期对于某些类型的信息很有用,包括机器生成的事件数据、日志和会话信息,因为这些信息只需保留有限的时间即可。
特殊的
TTL索引属性
支持TTL集合的实现。 TTL功能依赖于mongod中的后台线程,该后台线程读取索引中日期类型的值,并从集合中删除过期的
文档
。
要创建
TTL索引
,需要:
-
在值为日期或包含日期值的数组的字段上使用:
db.collection.createIndex()
方法,
-
指定
expireAfterSeconds
选项。
TTL索引是单个字段索引。复合索引不支持TTL属性。有关TTL索引的更多信息,请参见
TTL索引
。
使用
collMod
命令修改现有TTL索引的expireAfterSeconds选项。
1.通过指定的秒数,使文档过期
想要从索引字段时间值起经过指定的秒数后使数据过期,可以在保存BSON日期类型的值或BSON日期类型的对象数组的
字段上创建
TTL
索引,并在expireAfterSeconds
中指定一个大于零的值。
从索引字段的时间值开始,
expireAfterSeconds
中指定的秒数过去之后,文档将过期。 [1]
例如,下面的例子在
log_events
集合的
createdAt
字段上创建一个索引并把expireAfterSeconds的值指定为3600,将到期时间设置为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](1,2)如果该字段包含BSON日期类型对象的数组,则至少一个BSON日期类型对象中的一个大于expireAfterSeconds中指定的秒数时,数据将过期。
2.通过时钟时间,使文档过期
要使文档在特定的时钟时间过期,请:
- 首先在一个字段上创建TTL索引并指定expireAfterSeconds值为0(该字段保存BSON日期类型的值或BSON日期类型的对象的数组)。
- 然后对于集合中的每个文档,将索引日期字段值设置为文档应到期的时间值。如果索引日期字段包含过去的日期,则MongoDB认为文档已过期。
例如,以下操作在log_events集合的expireAt字段上创建索引,并将expireAfterSeconds值指定为0:
db.log_events.createIndex( { "expireAt": 1 }, { expireAfterSeconds: 0 } )
对于每个文档,将expireAt的值设置为对应于文档应过期的时间。例如,以下insert()操作添加了一个文档,该文档应在2013年7月22日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值过期。
上一篇:TTL索引
参考原文:https://docs.mongodb.com/manual/tutorial/expire-data/
Mongodb通常会被用来存储缓存数据或大尺寸、低价值的数据,对于这些类型的数据,数据量往往非常大,如果不定期清理,不但会影响性能,也会浪费大量的系统资源。
Mongodb其实可以像Redis一样设置数据的过期时间,TTL索引是MongoDB中一种特殊的索引,可以支持文档在一定时间之后自动过期删除,目前TTL索引只能在单字段上建立。
当你在集合中某一个字段建立TTL索引后,后台会有一个单线程,通过不断查询(默认60s一次)索引的值来判断document是否有过期,并且删除文档的动作还依据mongod实例的负载情况,如果负载很高,可能会稍微延后一段时间再删除。
创建TTL索引方法:
和普通索引的
类似Redis中的expire机制,MongoDB也可以设置过期自动删除的表。
MongoDB的过期设置依赖索引(TTL-index),设置过期字段使用的索引后,插入数据时在该字段指定日期时间,
经过在创建索引时指定的秒数后,该记录会被MongoDB认为已经过期,然后删除。
伴随数据量的增长和业务压力的增大,经常有接收到mongodb分片集群的性能告警邮件。
我所维护的几套分片集群有时一天能收到200来封告警邮件,不胜其烦。告警邮件大致分为三类:
1. cpu 负载过高。cpu load average 值超过30,cpu 使用率超过50%。
2. 空闲内存不足,系统对swap 分区使用超过50%。
3. IO
使用方法: db.Colloctions.ensureIndex({'date':1},{expireAfterSeconds:60})//date 为设置的索引,expireAfterSeconds为数据删除事件
MongoDB 透過mongod背景處理過期的資料https://docs.mongodb.com/manual/release-notes/2.2/,頻率為一分鐘一次。在建...
要删除 MongoDB 集合中的索引,你可以使用 `db.collection.dropIndex()` 命令。
例如,假设你有一个名为 "users" 的集合,并且你想删除名为 "age_1" 的索引,你可以使用以下命令:
db.users.dropIndex("age_1")
如果你想删除集合中的所有索引,你可以使用 `db.collection.dropIndexes()` 命令。例如:
db.users.dropIndexes()
注意:删除索引可能会导致数据库性能下降,因此应谨慎使用。
Anthony_zc:
【MongoDB】对现有集合(collection)进行分片
【MongoDB】对现有集合(collection)进行分片
hahaqundao: