mongodb TTL不删除文档

mongodb TTL不删除文档,mongodb,ttl,Mongodb,Ttl,我有一个简单的模式,如: { _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

我有一个简单的模式,如:

{
    _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") }
  • 你能告诉我们插入的记录是什么样子吗

  • “永远”有多长?因为有一个很大的警告:

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

  • 时间戳字段是否已经有索引

  • 你能告诉我们插入的记录是什么样子吗

  • “永远”有多长?因为有一个很大的警告:

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

  • 时间戳字段是否已经有索引

  • 这是我的问题: 我的索引创建错误,如下所示:

    {
        "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"
    }
    
    应该是这样的:(expireAfterSeconds是顶级属性)


    TTLMonitor每60秒运行一次,因此我认为它应该在到期后至少1分钟内被提取。我所说的从不是指从不(例如,几天过去了,没有任何东西被删除)。只有两个索引——TTL索引和我在键字段中指出的唯一索引。编辑中的示例文档。谢谢你的帮助。不,我想知道你在执行
    db.sess.find().pretty()
    时看到了什么——我只想确认时间戳字段在那里,看起来一点也不好笑。对于索引,您应该执行
    db.sess.getIndexes()
    以确认所有的索引都在那里。
    db.sess.getIndexes()
    向我展示了我的错误方法。我使用的是
    db['system.indexes'].find({expireAfterSeconds:{$ne:null}})
    ——在创建索引时,我在集合名称中有一个输入错误,我在
    system.indexes
    查询的输出中没有注意到它。非常感谢你的帮助!我正在使用Node.js mongoose,有时索引似乎无法通过。没有代码更改。只是重复执行,它有时有索引,有时没有。奇怪。@huggie你应该把它作为一个单独的问题发布。TTL监视器每60秒运行一次,所以我认为它应该在过期后至少1分钟内被提取出来。我所说的从不是指从不(例如,几天过去了,没有任何东西被删除)。只有两个索引——TTL索引和我在键字段中指出的唯一索引。编辑中的示例文档。谢谢你的帮助。不,我想知道你在执行
    db.sess.find().pretty()
    时看到了什么——我只想确认时间戳字段在那里,看起来一点也不好笑。对于索引,您应该执行
    db.sess.getIndexes()
    以确认所有的索引都在那里。
    db.sess.getIndexes()
    向我展示了我的错误方法。我使用的是
    db['system.indexes'].find({expireAfterSeconds:{$ne:null}})
    ——在创建索引时,我在集合名称中有一个输入错误,我在
    system.indexes
    查询的输出中没有注意到它。非常感谢你的帮助!我正在使用Node.js mongoose,有时索引似乎无法通过。没有代码更改。只是重复执行,它有时有索引,有时没有。奇怪。@huggie你应该把它作为一个单独的问题发布