MongoDB — обновление значения индекса TTL

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

database.collection(collectionName).createIndex({ "expires_on": 1 }, { expireAfterSeconds: 0 })
database.collection(collectionName).updateOne(query, update, { upsert: true }, (error, result) => {...})

Дело в том, что я установил дату expires_on на дату завтра, и значение установлено правильно в базе данных, но оно истекает в течение нескольких секунд. Есть ли проблема с тем, как я обновляю это поле? Я не знаю, как я могу обновить этот документ таким образом, чтобы срок его действия истекал в последнюю дату expires_on, для которой он был обновлен.

Я заметил, что вы не можете обновлять индексы в MongoDB, но обновляю ли я индекс здесь? Разве это не отличается, когда я пытаюсь изменить значение, а не сам индекс?


person Shaghayegh Tavakoli    schedule 28.04.2020    source источник


Ответы (2)


Вы поняли, что индекс ttl немного странным образом... В вашем примере кода вы устанавливаете срок действия каждого документа, у которого есть столбец временной метки «expires_on», истекающий прямо сейчас (expireAfterSeconds: 0).

Процесс с истекающим сроком действия работает в фоновом режиме, и если вы установите для expireAfterSeconds значение 0, он обнаружит все документы, значение которых «expires_on» меньше или равно now().

Таким образом, ваше обновление поля «expires_on» должно происходить в момент, когда «now () -lt expires_on».

Лучше сказать f.ex. "expireAfterSeconds: 3600", а затем обновить expires_on до значения "завтра минус эти 3600 секунд"...

person JJussi    schedule 29.04.2020

Тот факт, что я создавал индекс каждый раз, когда вставлялись новые данные, был нелогичным. Я установил индекс в своей базе данных один раз и каждый раз только обновлял документ:

database.collection(collectionName).updateOne(query, update, { upsert: true }, (error, result) => {...})

Однако проблема оказалась в значении, которое я установил для expires_on в своем коде. Из-за асинхронности Node.js значение было рассчитано неправильно.

person Shaghayegh Tavakoli    schedule 12.05.2020