- Indexes >
- Index Properties >
- TTL Indexes
TTL Indexes¶
On this page
TTL indexes are special single-field indexes that MongoDB can use to automatically remove documents from a collection after a certain amount of time or at a specific clock time. Data expiration is useful for certain types of information like machine generated event data, logs, and session information that only need to persist in a database for a finite amount of time.
To create a TTL index, use the db.collection.createIndex()
method with the expireAfterSeconds
option on a field whose value is
either a date or an array that
contains date values.
For example, to create a TTL index on the lastModifiedDate
field of
the eventlog
collection, use the following operation in the
mongo
shell:
db.eventlog.createIndex( { "lastModifiedDate": 1 }, { expireAfterSeconds: 3600 } )
Behavior¶
Expiration of Data¶
TTL indexes expire documents after the specified number of seconds has passed since the indexed field value; i.e. the expiration threshold is the indexed field value plus the specified number of seconds.
If the field is an array, and there are multiple date values in the index, MongoDB uses lowest (i.e. earliest) date value in the array to calculate the expiration threshold.
If the indexed field in a document is not a date or an array that holds a date value(s), the document will not expire.
If a document does not contain the indexed field, the document will not expire.
Delete Operations¶
A background thread in mongod
reads the values in the index
and removes expired documents from the collection.
When the TTL thread is active, you will see delete operations in the
output of db.currentOp()
or in the data collected by the
database profiler.
Timing of the Delete Operation¶
When you build a TTL index in the background, the TTL thread can begin deleting documents while the index is building. If you build a TTL index in the foreground, MongoDB begins removing expired documents as soon as the index finishes building.
The TTL index does not guarantee that expired data will be deleted immediately upon expiration. There may be a delay between the time a document expires and the time that MongoDB removes the document from the database.
The background task that removes expired documents runs every 60 seconds. As a result, documents may remain in a collection during the period between the expiration of the document and the running of the background task.
Because the duration of the removal operation depends on the workload
of your mongod
instance, expired data may exist for some
time beyond the 60 second period between runs of the background task.
Replica Sets¶
On replica set members, the TTL background thread only deletes documents when a member is in state primary. The TTL background thread is idle when a member is in state secondary. Secondary members replicate deletion operations from the primary.
Support for Queries¶
A TTL index supports queries in the same way non-TTL indexes do.
Record Allocation on MMAPv1¶
With the MMAPv1 storage engine, a collection with a TTL index has usePowerOf2Sizes
automatically enabled.
You cannot modify this setting for the collection. As a result of
enabling usePowerOf2Sizes
, MongoDB must allocate more disk
space relative to data size. This approach helps mitigate the
possibility of storage fragmentation caused by frequent delete
operations and leads to more predictable storage use patterns.
Restrictions¶
- TTL indexes are a single-field indexes. Compound indexes do not support TTL and ignore the
expireAfterSeconds
option. - The
_id
field does not support TTL indexes. - You cannot create a TTL index on a capped collection because MongoDB cannot remove documents from a capped collection.
- You cannot use
createIndex()
to change the value ofexpireAfterSeconds
of an existing index. Instead use thecollMod
database command in conjunction with theindex
collection flag. Otherwise, to change the value of the option of an existing index, you must drop the index first and recreate. - If a non-TTL single-field index already exists for a field, you
cannot create a TTL index on the same field since you cannot create
indexes that have the same key specification and differ only by the
options. To change a non-TTL single-field index to a TTL index, you
must drop the index first and recreate with the
expireAfterSeconds
option.