Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

mongodb TTL not removing documents

Tags:

mongodb

ttl

I have a simple schema like:

{
    _id: String,      // auto generated
    key: String,      // there is a unique index on this field
    timestamp: Date() // set to current time
}

Then I set the TTL index like so:

db.sess.ensureIndex( { "timestamp": 1 }, { expireAfterSeconds: 3600 } )

I expect the record to removed after 1 hour but it is never removed. I flipped on verbose logging and I see the TTLMonitor running:

Tue Sep 10 10:42:37.081 [TTLMonitor] TTL: { timestamp: 1.0 } { timestamp: { $lt: new Date(1378823557081) } }
Tue Sep 10 10:42:37.081 [TTLMonitor] TTL deleted: 0

When I run that query myself I see all my expired records coming back:

db.sess.find({ timestamp: { $lt: new Date(1378823557081) }})

...

Any ideas? I'm stumped.

EDIT - Example document below

{ "_id" : "3971446b45e640fdb30ebb3d58663807", "key" : "6XTHYKG7XBTQE9MJH8", "timestamp" : ISODate("2013-09-09T18:54:28Z") }
like image 321
jckdnk111 Avatar asked Sep 10 '13 19:09

jckdnk111


2 Answers

  1. Can you show us what the inserted records actually look like?

  2. How long is "never"? Because there's a big warning:

    Warning: The TTL index does not guarantee that expired data will be deleted immediately. There may be a delay between the time a document expires and the time that MongoDB removes the document from the database.

  3. Does the timestamp field have an index already?

like image 161
jcollum Avatar answered Nov 15 '22 03:11

jcollum


This was my issue: I had the index created wrong like this:

{
    "v" : 1,
    "key" : {
        "columnName" : 1,
        "expireAfterSeconds" : 172800
    },
    "name" : "columnName_1_expireAfterSeconds_172800",
    "ns" : "dbName.collectionName"
}

When it should have been this: (expireAfterSeconds is a top level propery)

{
    "v" : 1,
    "key" : {
        "columnName" : 1
    },
    "expireAfterSeconds" : 172800,
    "name" : "columnName_1_expireAfterSeconds_172800",
    "ns" : "dbName.collectionName"
}
like image 40
med116 Avatar answered Nov 15 '22 03:11

med116