时间:2024-02-13 10:24作者:下载吧人气:26
前序:
最近由于公司业务需求,对于3个月前的过期数据需要进行删除动作,以释放空间和方便维护
本来想的是使用crontab写个脚本定时执行,但是看到Mongo本身就有自动删除过期数据的功能,所以还是用一下吧
这个方法就是使用TTL索引,后续我再写一个脚本定时删除的任务,关于TTL索引的更多使用实例,大家可以参考学习这篇文章:
介绍:
TTL索引是MongoDB中一种特殊的索引, 可以支持文档在一定时间之后自动过期删除,目前TTL索引只能在单字段上建立,并且字段类型必须是date类型或者包含有date类型的数组(如果数组中包含多个date类型字段,则取最早时间为过期时间)
官网介绍链接:https://docs.mongodb.com/v3.2/core/index-ttl/
机制:
当你在集合中某一个字段建立TTL索引后,后台会有一个单线程,通过不断查询(默认60s一次)索引的值来判断document是否有过期,并且删除文档的动作还依据mongod实例的负载情况,如果负载很高,可能会稍微延后一段时间再删除。
还有一个需要注意的地方,在复制集成员中,TTL后台线程只删除primary的过期数据,如果此实例变为secondary角色,则后台线程闲置
创建TTL索引方法:
和普通索引的创建方法一样,只是会多加一个属性而已
例:在log_events的集合中,createTime 字段上建立一小时后过期的TTL索引
>db.log_events.createIndex( { “createTime”: 1 }, —字段名称
{ expireAfterSeconds: 60*60 } ) —过期时间(单位秒)
>db.log_events.getIndexes() —查看索引
[
{
“v” : 1,
“key” : {
“_id” : 1
},
“name” : “_id_”,
“ns” : “tt.t1”
},
{
“v” : 1,
“key” : {
“createTime” : 1
},
“name” : “createTime_1”,
“ns” : “tt.t1”,
“expireAfterSeconds” : 3600
}
]
网友评论