我有一个简单的架构,如:
{
_id: String, // auto generated
key: String, // there is a unique index on this field
timestamp: Date() // set to current time
}
然后我像这样设置TTL索引:
db.sess.ensureIndex( { "timestamp": 1 }, { expireAfterSeconds: 3600 } )
我希望记录在1小时后删除,但永远不会删除。 我打开了详细的日志记录,我看到TTLMonitor正在运行:
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
当我自己运行该查询时,我会看到所有过期的记录都回来了:
db.sess.find({ timestamp: { $lt: new Date(1378823557081) }})
...
有什么想法吗?我很难过。
编辑 - 下面的示例文档
{ "_id" : "3971446b45e640fdb30ebb3d58663807", "key" : "6XTHYKG7XBTQE9MJH8", "timestamp" : ISODate("2013-09-09T18:54:28Z") }
答案 0 :(得分:5)
您能告诉我们插入的记录实际上是什么样的吗?
“从不”多久了?因为有一个很大的警告:
警告:TTL索引不保证将立即删除过期数据。文档到期的时间与MongoDB从数据库中删除文档的时间之间可能会有延迟。
时间戳字段是否已有索引?
答案 1 :(得分:3)
这是我的问题: 我的索引创建错误如下:
{
"v" : 1,
"key" : {
"columnName" : 1,
"expireAfterSeconds" : 172800
},
"name" : "columnName_1_expireAfterSeconds_172800",
"ns" : "dbName.collectionName"
}
应该是这样的:( expireAfterSeconds是顶级的属性)
{
"v" : 1,
"key" : {
"columnName" : 1
},
"expireAfterSeconds" : 172800,
"name" : "columnName_1_expireAfterSeconds_172800",
"ns" : "dbName.collectionName"
}