加入收藏 | 设为首页 | 会员中心 | 我要投稿 聊城站长网 (https://www.0635zz.com/)- 智能语音交互、行业智能、AI应用、云计算、5G!
当前位置: 首页 > 服务器 > 系统 > 正文

mongodb中ttl索引是什么?怎样构建?

发布时间:2023-08-24 14:37:40 所属栏目:系统 来源:
导读:这篇文章给大家分享的是mongodb中的ttl索引内容,具体介绍了ttl索引的概念,ttl索引的创建、删除、添加等等操作,具有一定的借鉴参考价值,感兴趣的朋友就继续往下看吧。

TTL索引是一种特殊类型的单字段索
这篇文章给大家分享的是mongodb中的ttl索引内容,具体介绍了ttl索引的概念,ttl索引的创建、删除、添加等等操作,具有一定的借鉴参考价值,感兴趣的朋友就继续往下看吧。
 
       TTL索引是一种特殊类型的单字段索引,主要用于当满足某个特定时间之后自动删除相应的文档。也就是说集合中的文档有一定的有效期,超过有效期的文档就会失效,会被移除。也即是数据会过期。过期的数据无需保留,这种情形适用于如机器生成的事件数据,日志和会话信息等等。本文主要描述TTL索引的使用。
 
       一、TTL索引
 
创建方法
 
    db.collection.createIndex(keys, options)
 
    options:
 
        expireAfterSeconds 指定多少秒或者包含日期值的数组
 
创建示例
 
    db.eventlog.createIndex( { "lastModifiedDate": 1 }, { expireAfterSeconds: 3600 } )
 
何时失效
 
    在指定的时间达到后失效,也即是索引字段的值加上一个特定的秒数之后
 
    如果索引字段是一个数组,即索引字段上存在着多个日期值,此时MongoDB取最小值加上失效时间(lowest())
 
    对于非日期字段或不包含日期数组的索引字段,文档不会失效
 
    对于不包含索引字段的文档,文档不会失效
 
删除操作
 
    mongod的一个后台线程会读取索引的值并将失效的文档从集合移除
 
    当TTL线程被激活后,可以从db.currentOp()或者从profile观察到删除操作
 
何时删除
 
    当基于后台方式创建索引时,TTL线程能够在索引创建期间开始删除失效文档
 
    当基于前台方式创建索引时,TTL线程在索引创建完成后开始删除失效文档   
 
    TTL索引的删除不能完全保证失效期后一定删除,存在一定延迟(取决于mongod的工作负载)
 
    TTL删除文档后台线程每60s移除失效文档(因此可能存在已过失效期,文档还在的情形)
 
    在副本集环境中,TTL后台线程仅仅在主副本上工作,辅助副本上由复制操作实现
 
    在使用TTL索引查询时,与使用非TTL索引一样
 
一些限制
 
    不能基于已经存在索引的字段创建TTL索引以及非日期字段创建TTL索引,文档不会失效
 
    TTL索引不支持基于多个字段的复合索引
 
    不支持定长集合
 
 
 
       二、TTL索引示例
 
# mongo --shell localhost:27000 TTLData.js
 
MongoDB shell version: 3.2.11
 
connecting to: localhost:27000/test
 
repSetTest:PRIMARY> addTTLTestData() //添加集合数据
 
Create three records in database each with a create time that is 1 minute apart
 
Created three test documents, oldest being 4 mins old
 
Now create a TTL index with expiry of 5 mins on the createDate field as follows
 
db.ttlTest.ensureIndex({createDate:1}, {expireAfterSeconds:300})
 
repSetTest:PRIMARY> db.ttlTest.find()  //当前向集合里插入了3个文档
 
{ "_id" : 1, "createDate" : ISODate("2017-03-10T03:23:01.169Z") }
 
{ "_id" : 2, "createDate" : ISODate("2017-03-10T03:24:01.169Z") }
 
{ "_id" : 3, "createDate" : ISODate("2017-03-10T03:25:01.169Z") }
 
//下面为测试集合上的文档添加索引,即5分钟后索引失效
 
repSetTest:PRIMARY> db.ttlTest.createIndex({createDate:1}, {expireAfterSeconds:300})
 
{
 
    "createdCollectionAutomatically" : false,
 
    "numIndexesBefore" : 1, // Author : Leshami
 
    "numIndexesAfter" : 2,  // Blog  : http://blog.csdn.net/leshami
 
    "ok" : 1
 
}
 
//查找文档
 
repSetTest:PRIMARY> db.ttlTest.find()
 
{ "_id" : 1, "createDate" : ISODate("2017-03-10T03:23:01.169Z") }
 
{ "_id" : 2, "createDate" : ISODate("2017-03-10T03:24:01.169Z") }
 
{ "_id" : 3, "createDate" : ISODate("2017-03-10T03:25:01.169Z") }
 
//当指定时间到期后,文档被删除,如下,查询不到任何文档
 
repSetTest:PRIMARY> db.ttlTest.find()
 
 
 
 

(编辑:聊城站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章