Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Docs Menu
Docs Home
/ /

Elimina datos de las colecciones estableciendo TTL

Este documento proporciona una introducción al "tiempo de vida" de MongoDB o funcionalidad de colección TTL. Las colecciones TTL permiten almacenar datos en MongoDB y tener el mongod remover automáticamente los datos después de un número específico de segundos o en un momento específico según el reloj.

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.

Para que los datos caduquen en el Atlas Interfaz de Usuario, 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 document caduca automáticamente un segundo después del valor del campo expiresAfter.

    El índice TTL puede tardar de uno a dos segundos en hacer que el document expire. Puede que necesites actualizar la interfaz de usuario para ver que MongoDB Atlas elimina el document 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 del tipo de fecha BSON o un arreglo de objetos tipados como fecha BSON y especifica un valor mayor o igual a cero en el campo expireAfterSeconds. Un document expira cuando ha pasado el número de segundos en el campo expireAfterSeconds desde el tiempo especificado en su campo indexado. [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 elimina automáticamente documents de la colección log_events cuando el valor de createdAt del document [1] es 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}

Para hacer que los document caduquen a una hora determinada, crea un índice TTL en un campo que contenga valores del tipo de fecha BSON o un arreglo de objetos del tipo de fecha BSON, y especifica un expireAfterSeconds con valor de 0. Para cada document en la colección, establece el campo de fecha indexada a un valor correspondiente al momento en que el document debe expirar. Si el campo de fecha indexado contiene una fecha en el pasado, MongoDB considera el document 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 elimina automáticamente los document de la colección log_events cuando el valor expireAt de los document es más antiguo que el número de segundos especificado en expireAfterSeconds, es decir, 0 segundos más antiguo en este caso.

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 versión anterior a5.0 mongodump en un MongoDB 5.0.0 - 5.0.13 (o 6.0.0 - 6.0.1) instancia.

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

En esta página