Index TTL (expireAfterSeconds) în MongoDB & NoSQL

Un index TTL șterge automat documentele după un număr de secunde de la data dintr-un câmp; ideal pentru sesiuni și jurnale.

Sintaxă
db.colectie.createIndex({ <campData>: 1 }, { expireAfterSeconds: <secunde> })

Ce face Index TTL (expireAfterSeconds)

Un index TTL (time to live) se pune pe un câmp de tip Date. Un proces din fundal al serverului verifică periodic indexul și șterge documentele la care data + expireAfterSeconds a trecut. Așa nu mai ai nevoie de un script care să curețe sesiunile vechi sau codurile expirate.

Cu expireAfterSeconds: 0, fiecare document expiră exact la data din câmp, ceea ce îți permite termene diferite pe documente. Ștergerea nu este instantanee: procesul rulează la aproximativ 60 de secunde, iar pe un server încărcat poate întârzia. Documentele fără câmp sau cu altă valoare decât Date nu expiră niciodată.

Parametri

Parametru Descriere
expireAfterSeconds Secundele după data din câmp; 0 = expiră exact la acea dată.

Ce returnează

Numele indexului creat.

Exemple

Exemplele de pe această pagină pornesc de la datele de mai jos. Rulează mai întâi acest cod, apoi exemplul.

use magazin
db.sesiuni.insertOne({ utilizator: 'ana', token: 'ab12', creatLa: new Date() })

Exemplul 1: Sesiuni care expiră după o oră

Documentele dispar la circa o oră după valoarea din creatLa.

db.sesiuni.createIndex({ creatLa: 1 }, { expireAfterSeconds: 3600 })

Ieșire în mongosh

creatLa_1

Exemplul 2: Expirare la o dată exactă, diferită pe document

Fiecare cod are propriul termen în câmpul expiraLa.

db.coduri.createIndex({ expiraLa: 1 }, { expireAfterSeconds: 0 })
db.coduri.insertOne({ _id: 'REDUCERE10', expiraLa: new Date('2026-12-31T22:00:00Z') })

Ieșire în mongosh

magazin> db.coduri.createIndex({ expiraLa: 1 }, { expireAfterSeconds: 0 })
expiraLa_1
magazin> db.coduri.insertOne({ _id: 'REDUCERE10', expiraLa: new Date('2026-12-31T22:00:00Z') })
{ acknowledged: true, insertedId: 'REDUCERE10' }

Exemplul 3: Schimbarea duratei fără recrearea indexului

Comanda collMod modifică expireAfterSeconds pe indexul din exemplul 1.

db.runCommand({ collMod: 'sesiuni', index: { keyPattern: { creatLa: 1 }, expireAfterSeconds: 7200 } })

Ieșire în mongosh

{ expireAfterSeconds_old: 3600, expireAfterSeconds_new: 7200, ok: 1 }

Greșeli frecvente

  • Un câmp salvat ca text ('2026-10-25') în loc de Date nu expiră niciodată.
  • Nu te baza pe ștergerea la secundă: un document expirat poate fi încă găsit câteva zeci de secunde. Dacă e important, filtrează și în interogare (expiraLa: { $gt: new Date() }).
  • Indexul TTL trebuie să fie pe un singur câmp; un index compus nu poate avea expireAfterSeconds.

Comenzi înrudite

  • getIndexes(): Listează indexurile unei colecții, cu câmpurile, numele și opțiunile fiecăruia (unique, expireAfterSeconds etc.).
  • $currentDate: Operatorul $currentDate pune în câmp data și ora serverului în momentul actualizării, ca Date sau ca Timestamp.
  • createIndex() cu unique: true: Un index unic garantează că două documente nu pot avea aceeași valoare într-un câmp, de exemplu același email.