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:
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.
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 } )
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
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