Para melhor visualização, recomendo resolução de no mínimo 1280 x 800 e navegador Mozilla Firefox


segunda-feira, 9 de março de 2020

MongoDB - Índice TTL (Time to Live)

Por Eduardo Legatti

Olá,




O MongoDB possui um índice especial que pode ser criado para automaticamente remover documentos da collection de acordo com o valor especificado na propriedade expireAfterSeconds do índice. Vale a pena salientar que um índice TTL somente pode ser criado em um campo simples, não sendo permitido criar um índice composto. No exemplo abaixo irei criar uma collection chamada log_events e inserir 3 documentos em tempos diferentes.


> use bd01
switched to db bd01
> db.getCollection("log_events").insert({"createdAt": new Date(),"logEvent": 1,"logMessage": "Successo!"})
WriteResult({ "nInserted" : 1 })

> db.getCollection("log_events").insert({"createdAt": new Date(),"logEvent": 1,"logMessage": "Successo!"})
WriteResult({ "nInserted" : 1 })

> db.getCollection("log_events").insert({"createdAt": new Date(),"logEvent": 1,"logMessage": "Successo!"})
WriteResult({ "nInserted" : 1 })

Após a inserção dos documentos irei criar um índice TTL na coluna createdAt com a opção expireAfterSeconds de 60 segundos.


> db.getCollection("log_events").createIndex({"createdAt": 1}, {expireAfterSeconds: 60})
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1
}

Logo a seguir, se fizermos uma pesquisa ordenado pelo campo createdAt de forma descendente na collection log_events, irei verificar que os 3 documentos ainda existem.


> db.getCollection("log_events").find().sort({"createdAt": -1})

{ "_id" : ObjectId("5e6648604c6b3ab44b007757"), "createdAt" : ISODate("2020-03-09T13:45:04.164Z"), "logEvent" : 1, "logMessage" : "Successo!" }
{ "_id" : ObjectId("5e6648254c6b3ab44b007756"), "createdAt" : ISODate("2020-03-09T13:44:05.380Z"), "logEvent" : 1, "logMessage" : "Successo!" }
{ "_id" : ObjectId("5e6647e64c6b3ab44b007755"), "createdAt" : ISODate("2020-03-09T13:43:02.564Z"), "logEvent" : 1, "logMessage" : "Successo!" }

No minuto seguinte, ao realizar novamente a mesma pesquisa podemos perceber que apenas o documento com horário de 13:45 ainda existe e que no próximo minuto 13:46 ele também deixará de existir.


> db.getCollection("log_events").find().sort({"createdAt": -1})
{ "_id" : ObjectId("5e6648604c6b3ab44b007757"), "createdAt" : ISODate("2020-03-09T13:45:04.164Z"), "logEvent" : 1, "logMessage" : "Successo!" }

Caso precisemos alterar o índice para que o expurgo seja realizado em uma frequência diferente como por exempo mensal, bastará dropar o índice atual e criar um novo especificando expireAfterSeconds para um 1 mês em segundos: 24 x 3600 x 30 = 2592000 segundos.


> db.getCollection("log_events").createIndex({"createdAt": 1}, {expireAfterSeconds: 2592000})




Nenhum comentário:

Postagens populares