如果MongoDB中已存在索引,则忽略mongoose模式中的Expires设置

时间:2018-05-15 15:17:01

标签: node.js mongodb mongoose mongodb-indexes

我正在使用mongoose架构中的expires字段来设置给定字段的到期时间。例如:

var Crumbs = new Schema({
    ...
    timestamp: {
      type: Date,
      expires: 3600,
      required: true
    },
    ...
});

效果是预期的,如果索引以前不存在,则在MongoDB 中创建以下索引

> db.crumbs.getIndexes()
[
    ...
    {
        "v" : 2,
        "key" : {
            "timestamp" : 1
        },
        "name" : "timestamp_1",
        "ns" : "mydb.crumbs",
        "expireAfterSeconds" : 36000,
        "background" : true
    }
]

但是,如果索引以前存在,则不会创建。例如,如果我在代码中更改为expires: 360并重新运行我的程序,则MongoDB中的"expireAfterSeconds"保持36000

有没有办法强制索引使用模式中定义的值,即使索引已经存在?

2 个答案:

答案 0 :(得分:1)

您无法从架构定义中执行此操作。

最好的方法是直接在db中删除索引。

或者,从脚本中删除它。 E.g。

mongoose.connections[0].collections("collectionname")
.dropIndex("propertyName",callback)

答案 1 :(得分:0)

感谢Alex Blex提示,我终于解决了这个问题。首先删除索引,然后使用新的到期值重新创建:

mongoose.connections[0].collections.crumbs.dropIndex({timestamp: 1}, function (error) {
    if (error) {
        // This happens typically if the index doesn't exist but it doesn't hurt anyway
    }
    mongoose.connections[0].collections.crumbs.ensureIndex({timestamp: 1}, {expireAfterSeconds: 360});
});