使用 mongoose 的文档不会在 mongodb 后过期

Document not expiring in mongodb using mongoose

我将刷新令牌存储在 mongodb 数据库中。出于测试目的,我希望它们在 4 分钟内过期。出于某种原因,这个东西对我不起作用。

const mongoose =  require('mongoose');

let schema = new mongoose.Schema({
    token: {
        type: String,
        required: true
    },
    username: {
        type: String,
        required: true
    },
    email: {
        type: String,
        required: true
    },
});

schema.index({expireAt: 1}, {expiresAfterSeconds: 240}); //4 mins * 60 seconds

let model =  mongoose.model('refresh_token', schema);

module.exports = model;

这是我的文件的完整代码。我正在使用它来创建刷新令牌。截至目前,该项目持续了一个小时。请指出我的错误。

您正在尝试使用以下命令创建索引。

schema.index({expireAt: 1}, {expiresAfterSeconds: 240});

但是字段 expireAt 在您的架构中不存在。根据 mongo 文档 :-

If a document does not contain the indexed field, the document will not expire.

参考:- https://docs.mongodb.com/manual/core/index-ttl/

好的,我解决了这个问题,这是我的失误。

如果您正在使用猫鼬并进行测试,您很可能会更改 TTL 过期时间。我正在更改它以查看它是否正常工作并用于不同的测试目的,但是一旦在图集中创建了文档,请求不同的 TTL 时间将不会覆盖前一个。我把时间从 30 个月改为 5 分钟,为了测试目的做了很多波动。

所以记住这一点,一旦创建模型,TTL将被锁定,你需要删除集合并重新构建它,否则你必须在图集中手动更改TTL设置(我没有' t checked this out because my problem was solved only with this and I was in testing mode of my application)。还有

thanks to wak786

提议再次查看文档。当我阅读索引的工作原理时,它点击了。

删除集合(实际上重命名)后,我的最终刷新令牌文件如下所示。

const mongoose =  require('mongoose');

let schema = new mongoose.Schema({
    token: {
        type: String,
        required: true
    },
    username: {
        type: String,
        required: true
    },
    email: {
        type: String,
        required: true
    },
    createdAt: {
        type: Date,
        default: new Date()
    }
});

schema.index({"createdAt": 1}, {expireAfterSeconds: 2592000}); //30days * 24hours * 60 minutes * 60 seconds

let model =  mongoose.model('token', schema);

module.exports = model;