Mongoose不会创建TTL索引

时间:2014-11-12 17:14:00

标签: javascript node.js mongodb mongoose

这是我的Mongoose模型:

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)

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

但是,我无法让Mongoose创建索引。当我在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上提问的其他人不同,我的索引根本就没有创建。我也试过删除集合和数据库,当它们被重新创建时,它们仍然不包含索引。

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

修改

更多信息:我尝试直接从mongo控制台创建索引,其中包括:
db.sessions.ensureIndex({"expire":1}, {expireAfterSeconds: 21600})
这似乎有效(索引已创建)。

然而,它并没有以任何方式与Mongoose合作。

1 个答案:

答案 0 :(得分:4)

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

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