paint-brush
Cómo borrar documentos caducados automáticamente con MongoDB (índice TTL)por@lironer
23,072 lecturas
23,072 lecturas

Cómo borrar documentos caducados automáticamente con MongoDB (índice TTL)

por liron2m2020/10/28
Read on Terminal Reader
Read this story w/o Javascript

Demasiado Largo; Para Leer

Cómo borrar documentos caducados automáticamente con MongoDB (índice TTL) Necesitaba eliminar algunos documentos que guardé en MongoDB después de un tiempo. Mi esposa me dijo que MongoDB ya tiene incorporado ese mecanismo. Un subproceso en segundo plano lee los valores del índice y elimina los documentos caducados de la colección (normalmente cada minuto). El campo indexado debe ser del tipo de fecha BSON o una matriz de fechas BSON. Si un documento no contiene el campo indexado, el documento no caducará.

Company Mentioned

Mention Thumbnail
featured image - Cómo borrar documentos caducados automáticamente con MongoDB (índice TTL)
liron HackerNoon profile picture

Recientemente necesité eliminar algunos documentos que guardé en MongoDB después de un tiempo. Puedo pensar en algunos ejemplos de por qué querríamos eliminar datos después de un tiempo:

  • registros / eventos
  • claves api / tokens de acceso
  • usuarios no activos
  • etc.

Podríamos hacerlo ejecutando un cronjob que elimine los datos, eliminar los datos cada vez que insertamos datos nuevos o cualquier otra solución.

Afortunadamente para mí, mi esposa me dijo que MongoDB ya tiene incorporado ese mecanismo.

índice TTL

Los índices TTL (Time-To-Live) son índices especiales de un solo campo que MongoDB puede usar para eliminar automáticamente documentos de una colección después de una cierta cantidad de tiempo.

Un subproceso en segundo plano en MongoDB lee los valores en el índice y elimina los documentos caducados de la colección (generalmente cada minuto).

Por ejemplo, para crear un índice TTL en el

 lastModifiedDate
campo de la
 eventlog
colección, use la siguiente operación en el shell mongo:

 db.eventlog.createIndex( { "lastModifiedDate" : 1 }, { expireAfterSeconds : 3600 } )
  • El campo indexado debe ser del tipo de fecha BSON o una matriz de fechas BSON
  • Si el campo indexado en un documento no es una fecha o una matriz que contiene valores de fecha, el documento no caducará.
  • Si un documento no contiene el campo indexado, el documento no caducará.

Eliminación condicional

A partir de MongoDB 3.2, una colección se puede indexar parcialmente usando una expresión de filtro específica,

 partialFilterExpression
. El índice TTL también se puede utilizar con índices parciales.

Por ejemplo:

Eliminar documentos que se crearon hace 1 hora si

 state
igual a
 TMP

 db.eventlog.createIndex( { created_at : 1 }, { expireAfterSeconds : 3600 , partialFilterExpression : { state : 'TMP' } } );

Eliminar documentos que se crearon hace 1 día si

 count
es mas bajo que
 5

 db.eventlog.createIndex( { created_at : 1 }, { expireAfterSeconds : 86400 , partialFilterExpression : { count : { $lt : 5 } } } );

Información adicional sobre índices parciales

ejemplo del mundo real

Recientemente terminé de desarrollar BundleMon , que es una herramienta gratuita que te ayuda a monitorear el tamaño de tu paquete de aplicaciones.

Uno de los componentes de BundleMon es un servicio que guarda informes históricos para comparar el tamaño del paquete entre sucursales. Entonces, cuando abre un PR, BundleMon guarda un registro con el informe de tamaño de paquete actual.

No es necesario guardar el informe durante más de 30 días, así que solo agregué un índice TTL:

 db.reports.createIndex( { creationDate : 1 }, { expireAfterSeconds : 2592000 , partialFilterExpression : { prNumber : { $exists : true } } } );

También publicado en https://dev.to/lironer/delete-expired-documents-automatically-with-mongodb-ttl-index-l44