Usando índice TTL para expirar documentos MongoDB automaticamente

MongoDB

MongoDB

Estou há alguns meses sem postar nada aqui no blog, a correria tomou conta. Mas voltando à ativa e tirando as teias de aranha por aqui, vou começar postar pequenas dicas de bancos não relacionais, principalmente sobre o MongoDB que é o banco que mais tenho trabalhado ultimamente. Essas dicas servem tanto para mostrar funcionalidades legais como para minhas próprias referências futuras em consultorias e treinamentos que tenho realizado. Espero também que sejam úteis para quem utiliza MongoDB, se você gostou, deixe um comentário e compartilhe nas redes sociais!

Como expirar documentos automaticamente através de TTL

O MongoDB tem vários tipos de índices, um deles é o índice TTL (Time To Live) onde é possível manter um documento persistido por um determinado período de tempo. Depois dessa data e horário, o documento é automaticamente removido da coleção através de um processo interno do MongoDB, isso elimina a necessidade de fazer esse controle via aplicação e pode deixar seu banco muito mais organizado.

O procedimento é bem simples, primeiro precisamos criar um índice em alguma chave que possui objeto ISODate. No meu exemplo, vou usar uma coleção de eventos e quero eliminar aqueles que expiraram depois de uma determinada data e horário, o modelo de documento é o seguinte:

{
    "_id" : ObjectId("564cec68a20f83f7d67452ab"),
    "titulo" : "Evento teste",
    "expira_em" : ISODate("2015-11-17T21:26:00Z"),
    "ativo" : true
}

A chave que possui o ISODate é a “expira_em“, então vamos criar um índice para ela:

db.evento.createIndex({'expira_em':1},{expireAfterSeconds: 0})

Feito isso, vamos inserir um documento de teste para expirar às 21:26h do dia 17/11/2015

> db.evento.insert({
... 'titulo':'Evento teste',
... 'expira_em': new Date('November 17, 2015 19:26:00'),
... 'ativo':true})
WriteResult({ "nInserted" : 1 })

Documento inserido, agora são 19:25 e vou fazer uma consulta:

> db.evento.findOne()
{
    "_id" : ObjectId("564cec68a20f83f7d67452ab"),
    "titulo" : "Evento teste",
    "expira_em" : ISODate("2015-11-17T21:26:00Z"),
    "ativo" : true
}

Fui pegar um café e voltei às 19:28, hora de fazer outra consulta:

> db.evento.findOne()
null

Bazinga! Documento foi removido automaticamente pelo MongoDB.

Por hoje é só!

Vou publicar mais dicas nos próximos dias. Se você gostou, comente e compartilhe nas redes sociais! 🙂


Veja também