猫鼬不会创建 TTL 索引

Mongoose doesn't create TTL indexes

本文关键字:TTL 索引 创建      更新时间:2023-09-26

这是我的猫鼬模型:

var sessionSchema = new Schema({
    _id: { type: String, required: true, index: { unique: true } },
    user: { type: Schema.Types.ObjectId },
    expire: { type: Date, index: { expireAfterSeconds: 21600 } }
})
module.exports = mongoose.model('Session', sessionSchema)

我需要能够将日期对象设置为 expire(通常是 Date.now 加几分钟),并在过期 6 小时后从集合中删除该对象。

但是,我无法让猫鼬创建索引。当我在 mongo 控制台中运行db.sessions.getIndexes()时,输出如下:

[
    {
        "v" : 1,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "dev.sessions"
    }
]

我也尝试过不同的语法,例如
expire: { type: Date, expires: 21600 }(猫鼬的速记版)。
我还尝试在架构级别定义索引:

sessionSchema.index({ expire: 1 }, { expireAfterSeconds: 21600 })没有一个工作。

与其他在SO上提问的人不同,我的索引根本没有创建。我也尝试删除集合和数据库,当它们被重新创建时,它们仍然不包含索引。

版本: 猫鼬 3.8.19, MongoDB 2.6.5 (OSX) 和 Node.js 0.10.33

编辑

更多信息:我尝试直接从 mongo 控制台创建索引,使用:

db.sessions.ensureIndex({"expire":1}, {expireAfterSeconds: 21600})这似乎正在工作(索引已创建)。

但是,它与猫鼬没有任何关系。

显然,问题是我在自定义_id字段上创建了一个索引。MongoDB自己在该字段上创建一个索引,因此当Mongoose调用ensureIndex创建TTL索引时,它两者都失败了。

请参阅 https://github.com/LearnBoost/mongoose/issues/2459