MongoDB 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()

时间: 2024-09-27 23:15:12

MongoDB TTL索引的相关文章

MongoDB 唯一索引

MongoDB支持的索引种类很多,诸如单键索引,复合索引,多键索引,TTL索引,文本索引,空间地理索引等.同时索引的属性可以具有唯一性,即唯一索引.唯一索引用于确保索引字段不存储重复的值,即强制索引字段的唯一性.缺省情况下,MongoDB的_id字段在创建集合的时候会自动创建一个唯一索引.本文主要描述唯一索引的用法. 一.创建唯一索引语法 //语法 db.collection.createIndex( <key and index type specification>, { unique:

pymongo给mongodb创建索引的简单实现方法

  这篇文章主要介绍了pymongo给mongodb创建索引的简单实现方法,涉及Python使用pymongo模块操作mongodb的技巧,需要的朋友可以参考下 下面的代码给user的user_name字段创建唯一索引 ? 1 2 3 4 import pymongo mongo = pymongo.Connection('localhost') collection = mongo['database']['user'] collection.ensure_index('user_name',

mondodb-C#声明一个mongodb地理位置索引,并修改索引范围

问题描述 C#声明一个mongodb地理位置索引,并修改索引范围 默认情况下,mongodb地理空间索引假定你在索引经度/维度,并且这些值的范围是[-180180].但是我的坐标是大地坐标,不是经纬度,怎么在C#声明一个mongodb地理位置索引,并修改索引范围?shell是这样修改的:db.places.ensureIndex( { loc : ""2d"" } { min : -500 max : 500 } ) 解决方案 这里有现成的http://blog.c

数据-mongodb创建索引后过段时间就消失了?

问题描述 mongodb创建索引后过段时间就消失了? 对A,B两个集合同时创建两组复合索引,索引字段都才4个,创建成功后查询速度比原来快多了.过一天后查询看发现A集合又慢了,发现A集合的复合索引没有了,B集合的索引还在.(A集合数据比较大一大) 给A重新创建了几次索引,都是过段时间索引就自动消失了.要重新创建.求解啊 解决方案 这个应该不会主动消失 是不是倒入数据的时候又覆盖索引 解决方案二: 这个不应该把,索引创建了,只有有人删除了,才会没有. 不太可能说没人删除,就自动没有了,那mongod

MongoDB 复合索引

MongoDB支持复合索引,即将多个键组合到一起创建索引.该方式称为复合索引,或者也叫组合索引,该方式能够满足多键值匹配查询使用索引的情形.其次复合索引在使用的时候,也可以通过前缀法来使用索引.MongoDB中的复合索引与关系型数据库基本上一致.在关系型数据库中复合索引使用的一些原则同样适用于MongoDB.本文主要描述MongoDB复合索引. 一.复合索引相关概述 1.复合索引创建语法 db.collection.createIndex( { <field1>: <type>,

MongoDB的索引代码实现--BtreeBasedAccessMethod

MongoDB的索引代码实现--BtreeBasedAccessMethod 前言 学习开源软件的最好的办法就是阅读代码,MongoDB整个代码库有接近90万行代码,DB核心层大概50万行,代码量确实非常多.本文作为MongoDB代码导读的第一篇,从Index部分上入手分析代码实现.为何从索引部分开始介绍,首先代码量较少,总共5000多行,且相对其他模块来说比较独立:其次索引对数据库的优化至关重要,了解其实现,对日后的运维优化和索引自身的限制约定都具有实际意义.毕竟文档上的描述还是没有代码来的准

MongoDB 部分索引(Partial Indexes)

MongoDB部分索引只为那些在一个集合中,满足指定的筛选条件的文档创建索引.由于部分索引是一个集合文档的一个子集,因此部分索引具有较低的存储需求,并降低了索引创建和维护的性能成本.部分索引通过指定过滤条件来创建,可以为MongoDB支持的所有索引类型使用部分索引. 一.语法描述 创建部分索引语法 db.collection.createIndex(keys, options) options可以使用partialFilterExpression,即部分过滤表达式,其类型为文档类型 过滤表达式通

mongoDB的索引

  索引通常能够极大的提高查询的效率.在系统中使用查询时,应该考虑建立相关的索引. 索引是一种数据结构,他搜集一个集合中文档特定字段的值.MongoDB的查询优化器能够 使用这种数据结构来快速的对集合(collection)中的文档(collection)进行寻找和排序, 准确来说,这些索引是通过B-Tree索引来实现的. 1.创建简单索引 数据准备index.js,创建books文档并插入200000条数据,如下: for(var i=0;i<200000;i++){ db.books.ins

mongodb[七]索引

介绍:         索引在很多数据库中是提高性能的标志优化手段,所以在大数据量的情况下索引可以提高数据的查询速度,如果没有索引mongodb会扫描全部数据,才能获取满足条件的内容,在关系数据库中可以使用强制索引方式查询数据库,确保更准确快速的查询到满足条件的数据. 语法:         1.ensureIndex()  基本语法  1 创建升序索引  -1创建降序索引         2.mongodb 默认所以字段  _id ,创建文档,会自动创建,此索引不能删除由mongodb自己维护