Mongoose 到期 属性 无法正常工作

Mongoose expires property not working properly

答案

所以当我在 Mongoose 中使用 expires 属性 进行测试时,我成功地在数据库中设置了 TTL 索引,但没有意识到当我更改猫鼬模式中的时间时,我需要先从数据库中删除以前的 TTL 索引。

TLDR; - 停止应用程序并删除您要更改的字段的 TTL 索引(请参阅下面的评论/答案)

获取索引

使用以下示例中的代码,在调用之后: db.sampletexts.getIndexes() 我得到

[
    {
        "v" : 1,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.sampletexts"
    },
    { 
        "v" : 1,
        "key" : {
            "createdAt" : 1
        },
        "name" : "createdAt_1",
        "ns" : "test.sampletexts",
        "expireAfterSeconds" : 5400,
        "background" : true,
        "safe" : null
    }
]

所以虽然我指定了 60 秒,但它的设置为 5400?嗯

第二次更新

Heres a minimal example 我正在尝试 运行。我一定在这里遗漏了一些东西,因为我实际上将我的模型从我的原始项目复制到示例中(减去一些额外的字符串字段),现在文档根本没有过期?请让我感到愚蠢,并意识到我遗漏了一些明显的东西。我想了一秒钟,将间隔设置为 运行 文档和当前时间之间的时差检查,然后意识到 运行 经常会扩展的许多查询有多糟糕。嗯...

MongoDB v3.0.1 && Mongoose v4.0.1

相关代码在:/routes/index.js


我的一些测试值运行:

整个字段看起来像这样

createdAt: { type: Date, expires: 3600, default: Date.now }

测试 1:(测试 3 次) expires: ’300s’

过期时间: 2:00 && 2:50 && 2:28

测试 2:(测试 2 次) expires: ‘600s'

过期时间: 2:08 && 2:58

测试 3 expires: 600 过期时间:2:55

测试 4 expires: 3600 过期于: 2:13

更新:

我又回来了,因为我尝试了不同版本的 MongoDB,所以我决定尝试不同版本的 Mongoose v3.7.4。不幸的是我得到了同样的结果。我开始怀疑这是否可能是由我的实际计算机引起的问题(我在本地主机上 运行ning)?我不确定如何 MongoDB gets/sets/monitors 它的日期时间,但我假设它必须从我的计算机设置中获取它。有什么好的方法可以让我进一步 testing/debugging 吗?


原题:

好的,我已经在此处查看了一些关于使用 Mongoose 和 MongoDB 过期文档的其他答案,但它们似乎是因为

a) 文档没有被删除

b) 它在指定给

后的某一时刻被删除

我的问题是文档正在被删除,但无论如何都在 1 分钟后。所以当我指定一个时间时,无论何时,它都会在 60 秒后删除它。我看到 MongoDB 运行 每分钟检查一次以删除指定的文档,并且默认为 60 秒,所以我假设 MongoDB 正在确认可过期的文档,但不是获得传递的 TTL 参数,我很困惑。任何帮助将不胜感激。

这是我的模型:

var schema = mongoose.Schema({
    user_id: String,
    message: String,
    createdAt: { type: Date, expires: '4h', default: Date.now },
    location: Object
});

版本:

猫鼬 4.0.1

mongodb 3.0.1(也在 2.6.7 中测试过)

修改您的 Mongoose 架构不会修改现有索引,因此您需要手动删除 TTL 索引并重新启动您的应用以使用当前定义重新创建索引。

db.sampletexts.dropIndex('createdAt_1')