Nota
Si vas a eliminar documentos para ahorrar en costos de almacenamiento, considera Online Archive en MongoDB Atlas. Online Archive archiva automáticamente los datos a los que se accede con poca frecuencia en buckets S3 totalmente gestionados para una nivelación de datos 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.
Cree un índice TTL
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 lastModifiedDate campo de la eventlog colección, con un valor TTL de 3600 segundos, utilice la siguiente operación mongosh en:
db.eventlog.createIndex( { "lastModifiedDate": 1 }, { expireAfterSeconds: 3600 } )
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.
Convertir un índice de campo único que no sea TTL en un índice TTL
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 } })
Cambiar el expireAfterSeconds valor para un índice TTL
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
expireAfterSecondsno desencadena una reconstrucción completa del índice. Sin embargo, reducir el valorexpireAfterSecondspuede 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.
Comportamiento
Caducidad de los datos
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.
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á.
Operaciones de borrar
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.
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.
Momento de la operación de borrar
MongoDB comienza a eliminar los documentos caducados en cuanto el índice termina de compilarse en el índice principal. Para más información sobre el proceso de compilación de índices, consulte Compilacionesde índices en colecciones pobladas.
El índice TTL no garantiza que los datos caducados se eliminen inmediatamente tras su vencimiento. Puede haber un retraso entre el momento en que un documento caduca y el momento en que MongoDB lo elimina 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.
Sets de réplicas
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.
Soporte para queries
Un índice TTL brinda soporte a los queries de la misma manera que los índices no TTL.
Restricciones
Los índices TTL son índices de campo único. Los índices compuestos no brindan soporte a TTL e ignoran la opción
expireAfterSeconds.El campo
_idno brinda soporte a índices TTL.No es posible crear un índice TTL en una colección limitada.
No se puede crear un índice TTL en una colección de series temporales. Se ofrece una funcionalidad similar mediante la eliminación automática de colecciones de series temporales.
No se puede usar para cambiar el valor
createIndex()deexpireAfterSecondsde un índice existente. En su lugar,collModutilice elexpireAfterSecondscomando de base de datos. Consulte Cambiar el valor de un índice TTL.Si ya existe un índice de campo único no TTL para un campo, no se puede crear un índice TTL para el mismo campo, ya que no se pueden crear índices con la misma especificación de clave y que solo se diferencien en las opciones. Para convertir un índice de campo único no TTL en un índice TTL, utilice el
collModcomando de base de datos.