Параметр Expires в схеме mongoose игнорируется, если индекс уже существует в MongoDB - PullRequest
0 голосов
/ 15 мая 2018

Я использую поле expires в схеме mongoose , чтобы установить срок действия для данного поля.Например:

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 в своем коде и перезапускаю свою программу, "expireAfterSeconds" на MongoDB продолжает оставаться 36000.

Есть ли способ заставить индекс использовать значениеопределены в схеме, даже если индекс уже существует?

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Благодаря подсказке Алекса Блекса я наконец-то решил это.Сначала удалите индекс, а затем создайте заново с новым значением срока действия:

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});
});
0 голосов
/ 15 мая 2018

Вы не можете сделать это из определения схемы.

Лучший способ - удалить индекс непосредственно в БД.

В качестве альтернативы, удалить его из сценария.Например,

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