Menu Docs
Página inicial do Docs
/
Manual do MongoDB
/ /

Índices TTL

Nesta página

  • Criar um Índice TTL
  • Converter um índice de campo único não TTL em um índice TTL
  • Altere o valor de expireAfterSeconds para um índice TTL
  • Comportamento
  • Restrições

Observação

Se você estiver removendo documentos para economizar nos custos de armazenamento, considere o Online Archive no MongoDB Atlas. O Online Archive arquiva automaticamente dados acessados com pouca frequência em buckets S3 totalmente gerenciados para uma divisão econômica dos dados em níveis.

Os índices TTL são índices especiais de campo único que o MongoDB pode usar para remover automaticamente documentos de uma collection após um determinado período de tempo ou em um horário específico. A expiração de dados é útil para determinados tipos de informações, como dados de eventos gerados por máquina, registros e informações de sessão, que só precisam persistir em um banco de dados por um período de tempo finito.

Aviso

Depois de criar um índice TTL, ele poderá ter um grande número de documentos qualificados para excluir de uma só vez. Essa grande carga de trabalho pode causar problemas de desempenho no servidor. Para evitar esses problemas, planeje criar o índice fora do horário comercial ou exclua documentos qualificados em lotes antes de criar o índice para documentos futuros.

Para criar um índice TTL, utilize createIndex(). Especifique um campo de índice que seja um tipo de data ou um array que contenha valores de tipo de data. Use a opção expireAfterSeconds para especificar um valor de TTL em segundos.

O valor expireAfterSeconds do índice TTL deve estar dentro de 0 e 2147483647 inclusive.

Por exemplo, para criar um índice TTL no campo lastModifiedDate da collection eventlog , com um valor TTL de 3600 segundos, use a seguinte operação em mongosh:

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

Se uma coleção de séries temporais contiver documentos com timeField registros de data e hora anteriores a 1970-01-01T00:00:00.000Z ou posteriores a 2038-01-19T03:14:07.000Z, nenhum documento será excluído da coleção pelo recurso TTL "time to live".

A partir do MongoDB 5.1, você pode adicionar a opção expireAfterSeconds a um índice de campo único existente. Para alterar um índice de campo único não TTL para um índice TTL, utilize o comando de banco de dados collMod:

db.runCommand({
"collMod": <collName>,
"index": {
"keyPattern": <keyPattern>,
"expireAfterSeconds": <number>
}
})

O exemplo a seguir converte um índice de campo único não TTL com o padrão { "lastModifiedDate": 1 } em um índice TTL:

db.runCommand({
"collMod": "tickets",
"index": {
"keyPattern": { "lastModifiedDate": 1 },
"expireAfterSeconds": 100
}
})

To change the expireAfterSeconds value for a TTL Index, use the collMod database command:

db.runCommand({
"collMod": <collName>,
"index": {
"keyPattern": <keyPattern>,
"expireAfterSeconds": <number>
}
})

O exemplo a seguir altera o valor expireAfterSeconds de um índice com o padrão { "lastModifiedDate": 1 } na collection tickets:

db.runCommand({
"collMod": "tickets",
"index": {
"keyPattern": { "lastModifiedDate": 1 },
"expireAfterSeconds": 100
}
})

Importante

Considere o seguinte antes de atualizar o parâmetro expireAfterSeconds de um índice TTL:

  • Alterar o parâmetro expireAfterSeconds não aciona uma reconstrução completa do índice. No entanto, reduzir o valor de expireAfterSeconds pode tornar muitos documentos elegíveis para exclusão imediata, potencialmente causando problemas de desempenho devido ao aumento das operações de exclusão.

  • A abordagem recomendada é excluir manualmente os documentos em pequenos lotes antes de atualizar o índice TTL. Isso ajuda a controlar o impacto em seu cluster.

  • A exclusão de muitos documentos pode fragmentar os arquivos de armazenamento, afetando ainda mais o desempenho. Talvez seja necessário executar o comando compact em sua coleção ou realizar uma sincronização inicial para recuperar espaço e otimizar o armazenamento.

Os índices TTL expiram os documentos após o número especificado de segundos ter passado desde o valor do campo indexado. O limite de expiração é o valor do campo indexado mais o número especificado de segundos.

Se o campo for uma array e houver vários valores de data no índice, o MongoDB utilizará o mais baixo (mais antigo) valor de data na array para calcular o limite de expiração.

Se o campo indexado em um documento não for uma data ou uma array que detenha um ou mais valores de data, o documento não expirará.

Se um documento não contiver o campo indexado, ele não expirará.

Um thread de background em mongod lê os valores no índice e remove documentos expirados da collection.

Quando um thread TTL estiver ativo, você verá operações de exclusão na saída de db.currentOp() ou nos dados coletados pelo analisador de banco de dados.

Se uma coleção de séries temporais contiver documentos com timeField registros de data e hora anteriores a 1970-01-01T00:00:00.000Z ou posteriores a 2038-01-19T03:14:07.000Z, nenhum documento será excluído da coleção pelo recurso TTL "time to live".

O MongoDB começa a remover documentos expirados assim que o índice termina de ser construído no primário. Para obter mais informações sobre o processo de construção de índices, consulte Construções de Índices em Coleções Preenchidas.

O índice TTL não garante que os dados expirados serão excluídos imediatamente após a expiração. Pode haver um atraso entre o momento em que um documento expira e o momento em que o MongoDB remove o documento do reconhecimento de data center.

A tarefa no background que remove documentos expirados é executada a cada 60 segundos. Como resultado, os documentos podem permanecer numa collection durante o período entre a expiração do documento e a execução da tarefa no background. O MongoDB começa a excluir documentos de 0 a 60 segundos após a conclusão do índice.

Como a duração da operação de remoção depende do volume de trabalho da sua instância mongod, os dados expirados podem existir por algum tempo além do período de 60 segundos entre as execuções da tarefa no background.

As operações de exclusão iniciadas pela tarefa TTL são executadas em primeiro plano, como outras exclusões.

Nos membros do conjunto de réplicas, o thread TTL no background exclui documentos apenas quando um membro está no estado primary. O thread TTL no background fica ocioso quando um membro está no estado secundário. Os membros secundários replicam as operações de exclusão do primary.

Um índice TTL suporta queries da mesma forma que os índices não TTL.

← Propriedades do índice