mongoose如何自动删除过期数据?

设置了以下字段并不起作用。。。

const Schema = mongoose.Schema;
const mailCodeSchema = new Schema({
    username: {
        type: String,
        required: true
    },
    code: {
        type: Number,
        required: true
    },
    createdAt: {
        type: Date,
        expires: 60
    }
});
const mailCode = code_db.model('mail_code', mailCodeSchema);


await mailCode.create({
                username: email,
                code,
                createAt: Date.now()
            })
阅读 5.9k
1 个回答

查了一下mongoose文档,正确的写法似乎是:

...
createdAt: {
    type: Date,
    index: {expires: 60}
}
...

注意这个方法实际上是在集合上创建了一个TTL Index。这个索引完全可以通过手工创建,并且也推荐在生产环境中使用手工创建,原因如下:

  • 假设你的项目已经运行过一段时间,积累了一定量的数据;
  • 此时上面的代码上线了,第一次运行时将会自动开始创建TTL Index;
  • 由于你的集合已经有一定数据,这个创建索引的过程将需要锁定表一段时间才可以完成,这段时间内是无法对该表做任何操作的;

这个过程会导致你的生产环境在一段时间内无法访问,并且很难预料恢复时间,因此不如在生产环境维护时间创建索引,或者在创建索引时使用{background: true},或者使用滚动创建索引的方式。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题