6

我有一个简单的架构,例如:

{
    _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") }
4

2 回答 2

5
  1. 你能告诉我们插入的记录实际上是什么样的吗?

  2. “从不”有多长?因为有一个很大的警告:

    警告:TTL 索引不保证会立即删除过期数据。文档过期和 MongoDB 从数据库中删除文档的时间之间可能存在延迟。

  3. 时间戳字段是否已经有索引?

于 2013-09-10T20:35:32.890 回答
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"
}
于 2016-07-27T19:54:04.530 回答