TTL em documentos com MongoDB
Tags: mongodb, tt, developer, nosql
Published: 2023-08-11 12:40:15

O objetivo deste artigo é a demonstração de como podemos inserir documentos com tempo de vida (TTL — Time to Live ) no MongoDB.

Em alguns cenários a criação de documentos com tempo de vida pode ser necessário, como por exemplo, registros de logs ou de eventos. Em alguns bancos para efetuar a limpeza desses documentos seria necessário a criação de uma rotina para efetuar a exclusão desses dados após um determinado tempo. No MongoDB podemos utilizar os índices TTL para efetuar a exclusão automática desses dados.

**Índices**

Os índices são uma das ferramentas de otimização mais conhecidas e utilizadas para otimização de acesso, através dele o número de documentos a serem inspecionados passa a ser menor.

Para uma consulta mais detalhada sobre índices e seus tipos no MongoDB, podemos utilizar sua documentação disponível em [Índices - MongoDB](https://www.mongodb.com/docs/manual/indexes/).


**Índices TTL**

De acordo com a documentação do MongoDB, índices TTL são índices especiais de campo único que são usados para remover automaticamente documentos de uma coleção após uma determinada quantidade de tempo ou em um horário de relógio específico.

**Criando um índice TTL**

Para efetuar a criação de um índice TTL no MongoDB vamos utilizar como modelo a estrutura abaixo.

```cs
public class EventLog
{
    public string Name { get; set; }
    public string Description { get; set; }
    public string UserName { get; set;}
    public DateTime Date { get; set; }
    public DateTime Expiration { get; set; }
}
```

A partir do modelo acima, ao inserir um documento no Mongo vamos utilizar o campo **Expiration **como chave a ser utilizada para a exclusão automática.

O script abaixo é responsável pela criação do índice TTL na coleção **eventLog**.

```js
db.eventlog
  .createIndex( { "Expiration": 1 }, { expireAfterSeconds: 30} )
```

Abaixo temos o documento que será persistido no nosso banco.

```js
{
    "Name" : "Event Log 123",
    "Description" : "Description event log",
    "UserName" : "BH",
    "Date" : ISODate("2023-04-26T19:00:00.00+0000"),
    "Expiration" : ISODate("2023-04-26T20:00:00.00+0000"),
}
```

**Comportamento**

A expiração do documento ocorrerá após o número específico de segundos ter passado desde o valor do campo indexado, no nosso caso o valor do campo **Expiration + valor de expireAfterSeconds **utilizado na criação do index.

Para o exemplo de índice e registro que criamos, a expiração do registro iria ocorrer após as **“2023–04–26T20:00:30.00+0000”**.

**Informações adicionais**

Podemos criar um índice com o campo **expireAfterSeconds **igual a 0, com isso o documento terá sua expiração logo após o horário atual ser igual ao campo do documento utilizado como referência.

Se o campo for uma matriz que contenha mais valores do tipo data, será utilizado o menor valor como parâmetro para calcular o limite de expiração.

Se o campo do documento não for uma data ou uma matriz que contenha um ou mais valores do tipo data, o documento não será excluído.

**Referências**

[Indexes - MongoDB Manual](https://www.mongodb.com/docs/manual/indexes/)
[Índices TTL - MongoDB](https://www.mongodb.com/docs/manual/core/index-ttl/)