【问题标题】:Mongoose doesn't create TTL indexesMongoose 不创建 TTL 索引
【发布时间】:2015-01-09 15:22:54
【问题描述】:

这是我的猫鼬模型:

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 }(Mongoose 的简写版本)。
我还尝试在架构级别定义索引:
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。

【问题讨论】:

标签: javascript node.js mongodb mongoose


【解决方案1】:

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

https://github.com/LearnBoost/mongoose/issues/2459

【讨论】:

    猜你喜欢
    • 2012-09-09
    • 1970-01-01
    • 2023-03-26
    • 2015-03-17
    • 2021-10-25
    • 1970-01-01
    • 2019-12-18
    • 1970-01-01
    • 2020-05-12
    相关资源
    最近更新 更多