Mongoose到期财产不能正常运作

时间:2015-04-08 20:44:36

标签: mongodb mongoose nosql

答案

事实证明,当我在Mongoose中使用 expires 属性进行测试时,我在数据库中成功设置了TTL索引,但是当我在我的mongoose模式中更改时间时没有意识到我需要先从数据库中删除以前的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 。不幸的是我得到了相同的结果。我开始怀疑这可能是我的实际计算机引起的问题(我在localhost上运行)?我不确定MongoDB如何获取/设置/监视其DateTime,但我认为它必须从我的计算机设置中获取它。有没有一种方法可以进一步测试/调试?


原始问题:

好的,我已经看过一些关于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
});

版本:

mongoose 4.0.1

mongodb 3.0.1(也在2.6.7中测试)

1 个答案:

答案 0 :(得分:8)

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

db.sampletexts.dropIndex('createdAt_1')