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.