【问题标题】:mongodb TTL not removing documentsmongodb TTL不删除文档
【发布时间】:2013-09-14 16:24:57
【问题描述】:

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

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

【问题讨论】:

    标签: mongodb ttl


    【解决方案1】:

    这是我的问题: 我的索引创建错误是这样的:

    {
        "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"
    }
    

    【讨论】:

      【解决方案2】:
      1. 你能告诉我们插入的记录实际上是什么样子吗?

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

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

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

      【讨论】:

      • TTLMonitor 每 60 秒运行一次,所以我认为它应该在到期后至少 1 分钟内被拾取。从不我的意思是从不(例如,几天过去了,什么都没有被删除)。只有 2 个索引——我在关键字段上指出的 TTL 索引和唯一索引。编辑中的示例文档。感谢您的帮助。
      • 不,我想知道您在执行db.sess.find().pretty() 时会看到什么——我只是想确认时间戳字段在那里并且看起来并不好笑。对于索引,您应该使用db.sess.getIndexes() 来确认所有索引都存在。
      • db.sess.getIndexes() 向我展示了我的方式错误。我使用的是db['system.indexes'].find({expireAfterSeconds: {$ne: null}})——我在创建索引时在集合名称中有拼写错误,我在system.indexes 查询的输出中没有注意到它。非常感谢您的帮助!
      • 我正在使用 Node.js mongoose,有时索引似乎无法通过。没有代码更改。只是重复执行,有时有时没有索引。很奇怪。
      • @huggie 你应该把它作为一个单独的问题发布
      猜你喜欢
      • 2016-04-20
      • 2016-08-03
      • 1970-01-01
      • 2019-09-23
      • 2014-05-05
      • 2016-03-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多