Docs Menu
Docs Home
/ /
TTL Indexes

Elimina datos de las colecciones estableciendo TTL

Este documento proporciona una introducción al "tiempodevida" de MongoDB o Función de recopilaciónTTL. Las colecciones TTL permiten almacenar datos en MongoDB y tener la mongod eliminar automáticamente los datos después de una cantidad específica de segundos o en un momento específico.

Puede caducar datos para implementaciones alojadas en los siguientes entornos:

  • MongoDB Atlas: El servicio totalmente gestionado para implementaciones de MongoDB en la nube

  • MongoDB Enterprise: La versión basada en suscripción y autogestionada de MongoDB

  • MongoDB Community: La versión de MongoDB con código fuente disponible, de uso gratuito y autogestionada.

La expiración de datos es útil para algunas clases de información, incluidos los datos de eventos generados por máquinas, los registros y la información de sesiones que solo necesitan persistir durante un período de tiempo limitado.

Una propiedad especial de propiedad de índice TTL respalda la implementación de colecciones TTL. La característica TTL se basa en un hilo en segundo plano en mongod que lee los valores de tipo fecha en el índice y elimina los documentos caducados de la colección.

Para crear un índice TTL, utiliza createIndex(). Especifica un campo de índice que sea un tipo de fecha o un arreglo que contenga valores de tipo de fecha. Utiliza la opción expireAfterSeconds para especificar un valor de TTL en segundos.

Nota

El índice TTL es un índice de un solo campo. Los índices compuestos no son compatibles con la propiedad TTL. Para obtener más información sobre los índices TTL, consulta Índices TTL.

Puedes modificar el expireAfterSeconds de un índice TTL existente usando el comando collMod.

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.

Para expirar datos en la interfaz de usuario de Atlas, sigue estos pasos:

1
  1. Si aún no se muestra, seleccione la organización que contiene su proyecto deseado en el menú Organizations de la barra de navegación.

  2. Si aún no se muestra, seleccione su proyecto en el menú Projects de la barra de navegación.

  3. En la barra lateral, haz clic en Clusters en la sección Database.

    La página de clústeres se muestra.

2
  1. Para el clúster que contiene los datos que se desea que expiren, se debe hacer clic en Browse Collections.

  2. En el panel de navegación izquierdo, seleccione la base de datos.

  3. En el panel de navegación izquierdo, seleccione la colección.

3
  1. Haz clic en la pestaña Indexes.

  2. Haga clic en Create Index.

4
  1. En la sección Fields, introduzca el documento de especificación de la clave del índice. Para este ejemplo, introduzca el siguiente texto para crear un índice en el campo expiresAfter:

    { "expiresAfter": 1 }
  2. En la sección Options, introduzca la opción expireAfterSeconds. Para este ejemplo, introduce el siguiente texto para que los datos expiren 1 segundo después del valor del campo expiresAfter:

    { expireAfterSeconds: 1 }
  3. Haga clic en Review.

  4. Haga clic en Confirm.

5
  1. En el panel de navegación izquierdo, selecciona la colección que contiene el índice.

  2. Haz clic en la pestaña Find.

  3. Haga clic en Insert Document.

  4. Haz clic en el campo de texto debajo del campo _id e introduce el nombre del campo expiresAfter.

  5. Haga clic en el campo de texto junto a expiresAfter e introduzca el siguiente valor:

    2023-10-01T12:00:00.000+00:00

    Este valor expira los datos después de las 12:00 del 1 de octubre de 2023.

  6. Haz clic en el menú desplegable de tipo de dato y cambia el valor del tipo de dato a Date.

  7. Haga clic en Insert.

    El documento expirará automáticamente un segundo después del valor del campo expiredAfter.

    El índice TTL puede tardar entre 1 y 2 segundos en hacer que el documento expire. Es posible que debas actualizar la interfaz de usuario para ver que MongoDB Atlas borra el documento caducado.

Se pueden hacer expirar documentos tras un número de segundos especificado mediante las opciones de creación de colecciones o un índice TTL.

Para especificar el tiempo de expiración al crear una colección, utilice la opción expireAfterSeconds cuando cree su colección.

Nota

La opción expireAfterSeconds solo está disponible para colecciones de series de tiempo y colecciones con índice clusterizado.

Para que los datos expiren después de que haya transcurrido un número especificado de segundos desde el campo indexado, crea un índice TTL en un campo que contenga valores de tipo de fecha BSON o un arreglo de objetos de tipo de fecha BSON y especifica un valor mayor o igual a cero en el campo expireAfterSeconds. Un documento expirará cuando el número de segundos en el campo expireAfterSeconds haya pasado desde el tiempo especificado en su campo de índice. [1]

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

Por ejemplo, la siguiente operación crea un índice en el campo createdAt de la colección log_events y especifica el valor expireAfterSeconds de 10 para establecer el tiempo de expiración a diez segundos después del tiempo especificado por createdAt.

db.log_events.createIndex( { "createdAt": 1 }, { expireAfterSeconds: 10 } )

Al añadir documentos a la colección log_events, establece el campo createdAt en la hora actual:

db.log_events.insertOne( {
"createdAt": new Date(),
"logEvent": 2,
"logMessage": "Success!"
} )

MongoDB borrará automáticamente los documentos de la colección log_events cuando el valor createdAt del documento [1] sea más antiguo que el número de segundos especificado en expireAfterSeconds.

[1](1, 2) Si el campo contiene un arreglo de objetos de tipo fecha BSON, los datos expiran si al menos uno de los objetos de tipo fecha BSON es más antiguo que el número de segundos especificado en expireAfterSeconds.

Para expirar documentos con expresiones de filtro específicas, puedes crear un índice que sea tanto parcial como TTL.

Cree un índice TTL parcial:

db.foo.createIndex(
{ F: 1 },
{
name: "Partial-TTL-Index",
partialFilterExpression: { D : 1 },
expireAfterSeconds: 10
}
)

Inserta dos documentos, uno de los cuales debe coincidir con la expresión de filtro { D : 1 } del partialFilterExpression:

db.foo.insertMany( [
{ "F" : ISODate("2019-03-07T20:59:18.428Z"), "D" : 3},
{ "F" : ISODate("2019-03-07T20:59:18.428Z"), "D" : 1}
] )

Espera diez segundos y luego query la colección foo:

db.foo.find({}, {_id: 0, F: 1, D: 1})

El documento que coincide con el partialFilterExpression de { D : 1 } se borra (caducado). Como resultado, solo queda un documento en la colección foo:

{ "F" : ISODate("2019-03-07T20:59:18.428Z"), "D" : 3}

Puedes hacer que los datos caduquen a una hora específica en el terminal. Para que los documentos expiren a una hora específica, comienza creando un índice TTL en un campo que contenga valores de tipo de fecha BSON o un arreglo de objetos de tipo de fecha BSON y especifica un valor expireAfterSeconds de 0. Para cada documento de la colección, establece el campo de fecha indexada en un valor correspondiente al momento en que el documento debe expirar. Si el campo de fecha indexado contiene una fecha en el pasado, MongoDB considera que el documento está expirado.

Por ejemplo, la siguiente operación crea un índice en el campo expireAt de la colección log_events y especifica el valor expireAfterSeconds de 0:

db.log_events.createIndex( { "expireAt": 1 }, { expireAfterSeconds: 0 } )

Para cada documento, establece el valor de expireAt para que corresponda al momento en que el documento deba expirar. Por ejemplo, la siguiente operación insertOne() añade un documento que expira a las July 22, 2013 14:00:00.

db.log_events.insertOne( {
"expireAt": new Date('July 22, 2013 14:00:00'),
"logEvent": 2,
"logMessage": "Success!"
} )

MongoDB borrará automáticamente documentos de la colección log_events cuando el valor expireAt de los documentos sea más antiguo que el número de segundos especificado en expireAfterSeconds, es decir, 0 segundos más antiguo en este caso. Por lo tanto, los datos expiran en el valor expireAt especificado.

Advertencia

Posible pérdida de datos

Cuando un índice TTL tiene expireAfterSeconds configurado en NaN, las actualizaciones, degradaciones y ciertas operaciones de sincronización pueden llevar a un comportamiento inesperado y una posible pérdida de datos.

No establezca expireAfterSeconds en NaN en su configuración de índice TTL.

Antes de MongoDB 5.0, cuando un índice TTL tiene expireAfterSeconds configurado en NaN, MongoDB registra un error y no remueve ningún registro.

Desde MongoDB 5.0.0 - 5.0.13 (y 6.0.0 - 6.0.1), NaN se considera como 0. Si se configura un índice TTL con expireAfterSeconds establecido en NaN, todos los documentos indexados por TTL caducan inmediatamente.

A partir de MongoDB 5.0.14 (y 6.0.2), el servidor no utilizará índices TTL que tengan expireAfterSeconds configurado en NaN.

Sin embargo, todavía existen algunas situaciones que pueden resultar en un comportamiento inesperado. Los documentos pueden expirar:

  • Durante una sincronización inicial a una versión anterior desde MongoDB 5.0.0 - 5.0.13 (o 6.0.0 - 6.0.1).

  • Al actualizar desde una versión anterior a MongoDB 5.0.0 - 5.0.13.

  • Al restaurar una colección desde una instancia anterior5.0 mongodump a en una instancia de MongoDB 5.0.0 -..5 (o..0 -..).13 600 601

Para evitar problemas, descarte o corrija cualquier índice TTL mal configurado.

1

Ejecuta el siguiente script en el shell mongosh. El script no funciona en el shell mongo heredado.

function getNaNIndexes() {
const nan_index = [];
const dbs = db.adminCommand({ listDatabases: 1 }).databases;
dbs.forEach((d) => {
if (d.name != 'local') {
const listCollCursor = db
.getSiblingDB(d.name)
.runCommand({ listCollections: 1 }).cursor;
const collDetails = {
db: listCollCursor.ns.split(".$cmd")[0],
colls: listCollCursor.firstBatch.map((c) => c.name),
};
collDetails.colls.forEach((c) =>
db
.getSiblingDB(collDetails.db)
.getCollection(c)
.getIndexes()
.forEach((entry) => {
if (Object.is(entry.expireAfterSeconds, NaN)) {
nan_index.push({ ns: `${collDetails.db}.${c}`, index: entry });
}
})
);
}
});
return nan_index;
};
getNaNIndexes();
2

Utilice el comando collMod para actualizar cualquier valor de expireAfterSeconds mal configurado que el script haya encontrado.

Como alternativa, se puede drop cualquier índice TTL mal configurado y recrearlo más tarde utilizando el comando createIndexes.

Volver

TTL Indexes

En esta página