MongoDB TTL索引

545 阅读2分钟

官方文档:docs.mongodb.com/manual/core…

TTL索引是一种特殊的单字段索引,MongoDB可以使用它在一定时间后或在特定的时钟自动从集合中删除文档。

数据过期对于某些类型的信息很有用,比如机器生成的事件数据、日志和会话信息,这些信息只需要在数据库中保存有限的时间。

要创建TTL索引,请在一个值为日期或包含日期值的数组的字段上使用所需的TTL值(以秒为单位)指定expireAfterSeconds选项。

例如,在eventlog集合的lastModifiedDate字段上创建一个TTL索引,TTL值为3600秒,可以在mongosh中使用如下操作:

JSON复制代码

db.eventlog.createIndex( { "lastModifiedDate": 1 }, { expireAfterSeconds: 3600 } )

TTL索引在经过指定的秒数后过期文档,即过期阈值时索引字段值加上指定的秒数。

注意事项:

  • 如果该字段是一个数组,并且索引中有多个日期值,MongoDB使用数组中的最低(即最早)日期值来计算过期阈值。

  • 如果文档中的索引字段不是一个日期或包含一个或多个日期值的数组,则文档不会过期。

  • TTL索引不能保证过期的数据在过期时立即被删除,在文档过期和MongoDB从数据库中删除文档之间可能存在延迟。

  • 在副本集成员上,TTL后台线程只在成员处于primary状态时删除文档。当成员处于secondary状态时,TTL后台线程是空闲的。辅助成员从主成员复制删除操作。

怎么修改expireAfterSeconds的值?

方法:

1.使用collMod命令。

语法:格式为{keyPattern: <TTL索引>, expireAfterSeconds: <修改后的过期时间> }

JSON复制代码

db.runCommand( {
   collMod: <collection>,
   index: {
      keyPattern: <index_spec> || name: <index_name>,
      expireAfterSeconds: <number>,  // If changing the TTL expiration threshold
      hidden: <boolean>              // If changing the visibility of the index from the query planner
   }
} )

示例:

test:PRIMARY> db.runCommand({collMod: 'log_events', index: {keyPattern:{createdAt:1}, expireAfterSeconds:800}})
{
    "expireAfterSeconds_old" : 360,
    "expireAfterSeconds_new" : 800,
    "ok" : 1,
    "operationTime" : Timestamp(1634197196, 2),
    "$clusterTime" : {
        "clusterTime" : Timestamp(1634197196, 2),
        "signature" : {
            "hash" : BinData(0,"3tsaRIh+UbauFUmQHkitwQjEZzc="),
            "keyId" : NumberLong("6989066664348221441")
        }
    }
}

2.先删除该索引并重新创建。