Docs Menu
Docs Home
/ /

TTL Indexes

Nota

Si está eliminando documentos para ahorrar en costos de almacenamiento, considere Archivo en línea en MongoDB Atlas. El archivo en línea archiva automáticamente los datos de acceso poco frecuente en buckets S totalmente administrados3 para una organización de datos en niveles rentable.

Los "Time-to-live" (TTL) índices son índices especiales de un solo campo que MongoDB puede utilizar para remover automáticamente documentos de una colección después de un cierto período de tiempo o a una hora específica. La expiración de datos es útil para ciertos tipos de información, como los datos de eventos generados por máquinas, los registros y la información de sesiones, que solo necesitan persistir en una base de datos durante un tiempo finito.

Puedes crear y gestionar índices TTL en la interfaz de usuario para implementaciones alojadas en MongoDB Atlas.

Advertencia

Después de crear un índice TTL, es posible que tenga una gran cantidad de documentos que cumplan con los requisitos para borrar de una vez. Esta gran carga de trabajo podría causar problemas de rendimiento en el servidor. Para evitar estos problemas, planifica crear el índice durante horas no laborables o borra los documentos calificados en grupos antes de crear el índice para documentos futuros.

Para crear un índice TTL, utilice createIndex(). Especifique un campo de índice que sea de tipo fecha o una matriz que contenga valores de tipo fecha. Use la expireAfterSeconds opción para especificar un valor TTL en segundos.

El valor del índice TTL expireAfterSeconds debe estar entre 0 y 2147483647, inclusive.

Por ejemplo, para crear un índice TTL en el campo lastModifiedDate de la colección eventlog con un valor TTL de 3600 segundos, utilice la siguiente operación en mongosh:

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

A partir de MongoDB 7.0, puedes crear índices TTL parciales en colecciones de series de tiempo. Estos índices utilizan la colección timeField como campo clave y requieren una expresión de filtro parcial en el metaField.

Las colecciones de series de tiempo incluyen un campo opcional expireAfterSeconds. Si no se establece expireAfterSeconds, un índice TTL con una partialFilterExpression permite establecer un período de expiración para los documentos que coinciden con el filtro. Si se configura expireAfterSeconds, un índice TTL parcial permite establecer un período de caducidad diferente y más corto para los documentos coincidentes. Solo se puede crear una partialFilterExpression en el metaField.

Importante

Si el valor expireAfterSeconds de la colección es menor que el expireAfterSeconds del índice TTL parcial, la colección borra los documentos después del tiempo más corto, por lo que el índice TTL no tiene efecto.

Si una colección de series temporales contiene documentos con marcas de timeField tiempo anteriores a 1970-01-01T00:00:00.000Z o posteriores a,2038-01-19T03:14:07.000Z la función TTL "tiempo de vida" no elimina ningún documento de la colección.

Esta colección de series de tiempo de datos meteorológicos borra documentos después de 24 horas:

db.createCollection(
"weather24h",
{
timeseries: {
timeField: "timestamp",
metaField: "sensor",
granularity: "hours"
},
expireAfterSeconds: 86400
}
)

Este índice TTL borra documentos del sensor meteorológico de la sede de MongoDB en Nueva York después de 1 hora, en lugar de 24 horas:

db.eventlog.createIndex(
{ "timestamp": 1 },
{ partialFilterExpression: { "sensor": { $eq: "40.761873, -73.984287" } } },
{ expireAfterSeconds: 3600 } )

A partir de MongoDB 5.1, puedes añadir la opción expireAfterSeconds a un índice de campo único existente. Para cambiar un índice de campo único no TTL a un índice TTL, usa el comando de base de datos collMod:

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

El siguiente ejemplo convierte un índice de un solo campo no-TTL con el patrón { "lastModifiedDate": 1 } en un índice TTL:

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

Para cambiar el valor expireAfterSeconds de un índice TTL, usa el comando de base de datos collMod:

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

El siguiente ejemplo cambia el valor de expireAfterSeconds para un índice con el patrón { "lastModifiedDate": 1 } en la colección tickets:

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

Importante

Considera lo siguiente antes de actualizar el parámetro expireAfterSeconds de un índice TTL:

  • Cambiar el parámetro expireAfterSeconds no desencadena una reconstrucción completa del índice. Sin embargo, reducir el valor expireAfterSeconds puede hacer que muchos documentos sean elegibles para eliminación inmediata, lo que podría causar problemas de rendimiento debido al aumento de las operaciones de eliminación.

  • La recomendación es borrar manualmente los documentos en pequeños grupos antes de actualizar el índice TTL. Esto ayuda a controlar el impacto en el clúster.

  • Eliminar muchos documentos puede fragmentar los archivos de almacenamiento, además de afectar el rendimiento. Es posible que necesite ejecutar el comando compact en la colección o realizar una sincronización inicial para recuperar espacio y optimizar el almacenamiento.

Los índices TTL eliminan los documentos después de que haya transcurrido el número especificado de segundos desde el valor del campo indexado. El umbral de expiración es el valor del campo indexado más el número especificado de segundos.

Si el campo es un arreglo y hay múltiples valores de fecha en el índice, MongoDB utiliza el valor más bajo (la fecha más temprana) en el arreglo para calcular el umbral de expiración.

Para las colecciones de series de tiempo, los índices TTL también remueven un bucket de datos cuando todos los documentos en su interior expiran. Esto es igual al límite superior de la marca de tiempo del bucket, más el valor de expireAfterSeconds. Por ejemplo, si un bucket cubre datos hasta 2023-03-27T18:29:59Z y expireAfterSeconds es 300, el índice TTL expira el bucket después de 2023-03-27T18:34:59Z.

Si el campo indexado en un documento no es una fecha o una matriz que contiene uno o más valores de fecha, el documento no caducará.

Si un documento no contiene el campo indexado, el documento no expirará.

Un hilo en segundo plano en mongod lee los valores del índice y remueve documentos expirados de la colección.

Las operaciones de borrado en progreso realizadas por el hilo TTL aparecen en el resultado de db.currentOp(). A medida que el hilo de TTL borra documentos, se incrementa la métrica de estado del servidor metrics.ttl.deletedDocuments.

A partir de MongoDB 6.1:

  • Para mejorar la eficiencia, MongoDB puede agrupar la eliminación de múltiples documentos.

  • Los resultados explain del comando contienen una nueva BATCHED_DELETE etapa para la eliminación de documentos agrupados.

Si una colección de series temporales contiene documentos con marcas de timeField tiempo anteriores a 1970-01-01T00:00:00.000Z o posteriores a,2038-01-19T03:14:07.000Z la función TTL "tiempo de vida" no elimina ningún documento de la colección.

El proceso de borrado en segundo plano de TTL verifica cada índice TTL para documentos expirados. Para cada índice TTL, el proceso en segundo plano borra documentos hasta que se cumpla una de las siguientes condiciones:

  • El proceso borra 50000 documentos del índice actual.

  • El proceso toma un segundo para borrar documentos del índice actual.

  • Todos los documentos expirados se borran del índice actual.

Luego, el proceso avanza al siguiente índice. Después de que el proceso pase por cada índice TTL una vez, el subproceso actual se completa y comienza un nuevo subproceso para verificar los documentos expirados restantes. Un pase se completa cuando el supervisor TTL ha borrado todos los documentos candidatos posibles de todos los índices TTL.

Además, el proceso detiene el bucle de borrado actual cada 60 segundos para evitar dedicar demasiado tiempo a un solo borrado grande. Cuando esto ocurre, el subpase actual termina y comienza un nuevo subpase.

Los pases y subpases se rastrean en las métricas de estado del servidor metrics.ttl.passes y metrics.ttl.subPasses, respectivamente.

MongoDB comienza a remover los documentos caducados o los buckets de series de tiempo tan pronto como el índice termina de construirse en el primario. Para obtener más información sobre el proceso de creación de índices, consulta Creación de índices en colecciones pobladas.

El índice TTL no garantiza que los datos expirados se borren inmediatamente tras su expiración. Puede haber un retraso entre el momento en que un documento expira y el momento en que MongoDB lo remueve de la base de datos.

La tarea en segundo plano que remueve los documentos expirados se ejecuta cada 60 segundos. Como resultado, los documentos pueden permanecer en una colección durante el período entre la expiración del documento y la ejecución de la tarea en segundo plano. MongoDB comienza a borrar documentos entre 0 y 60 segundos después de que el índice se complete.

Debido a que la duración de la operación de remoción depende de la carga de trabajo de la instancia mongod, los datos expirados pueden existir durante algún tiempo después del período de 60 segundos entre ejecuciones de la tarea en segundo plano.

Las operaciones de borrado iniciadas por la tarea TTL se ejecutan en primer plano, como otros borrados.

En los nodos del set de réplicas, el hilo de segundo plano de TTL solo borra documentos cuando un nodo está en estado primario. El hilo de segundo plano de TTL está inactivo cuando un nodo está en el estado secundario. Los nodos secundarios replican las operaciones de borrado desde el primario.

Un índice TTL brinda soporte a los queries de la misma manera que los índices no TTL.

Volver

Sparse

Obtén una insignia de habilidad

¡Domina los "Fundamentos del diseño de indexación" gratis!

Más información

En esta página