Временные индексы в MongoDB

MongoDB

В MongoDB есть индекс, называемый индексом TTL (индекс времени жизни, индекс с жизненным циклом), который позволяет установить тайм-аут для каждого документа. Документ удаляется, когда он достигает заданного уровня устаревания. Срок действия данных полезен для определенных типов информации, таких как машинные данные о событиях, журналы и информация о сеансах, которые необходимо хранить в базе данных только в течение ограниченного времени.

Индекс TTL можно создать, указав параметр expireAfterSeconds в createIndex:

// 超时时间为24小时,默认是前台运行,可以通过background:true设置为后台模式
db.user_session.createIndex({"updated":1},{expireAfterSeconds:60*60*24});

Это создает индекс TTL для обновленного поля. Если обновленное поле документа существует и его значение имеет тип date, документ будет удален, когда время сервера будет expireAfterSeconds секунд позже, чем время обновленного поля документа.

db.getCollection('user_session').insert(
  {
    _id: NumberInt(1),
    "updated":new Date(),
     username:'lisi'
  }
);

Время UTC, используемое mongodb для сохранения времени, будет преобразовано во время по Гринвичу при запросе результата, поэтому вы можете видеть, что сохраненное время на 8 часов отличается от времени компьютера (GMT+8). db.getCollection('user_session').find({updated:{$gt: new Date("2019-07-12 14:00:00")}}) Вы можете использовать new Date() для прямой проверки времени, когда запрос Для сравнения параметр, переданный новой датой, является временем по Гринвичу.

Чтобы предотвратить удаление активных сеансов, значение обновляемого поля может быть обновлено до текущего времени, когда в сеансе есть активность. Пока обновленное время отличается от текущего времени на 24 часа. Соответствующий документ будет удален.

Функциональность TTL MongoDB опирается на фоновый поток в mongodb, который считывает значения типа даты в индексе и удаляет документы с истекшим сроком действия из коллекции. MongoDB очищает индексы TTL каждую минуту, поэтому вам не следует полагаться на секунды, чтобы поддерживать индексы в рабочем состоянии. И индексы TTL не гарантируют, что просроченные данные будут удалены сразу после истечения срока действия. Может быть задержка между истечением срока действия документа и удалением документа MongoDB из базы данных. Так как фоновая задача по удалению просроченных документов запускается каждые 60 секунд. Поэтому документы могут оставаться в коллекции в течение периода между истечением срока действия документа и запуском фоновой задачи.

исходный код вGitHub.com/MongoDB/Мока…

mongodb не поддерживает использование createIndex для сброса времени истечения срока действия. Вы можете использовать только команду collMod для изменения значения expireAfterSeconds:

db.runCommand({collMod:"user_session",index: {name:"updated_1",expireAfterSeconds: 120}});

После успешной модификации вы получите такое сообщение (предыдущее время истечения составляло одну минуту, а теперь оно изменено на 2 минуты)

{
    "expireAfterSeconds_old" : 60.0,
    "expireAfterSeconds_new" : 120.0,
    "ok" : 1.0
}

В данной коллекции может быть несколько индексов TTL. Вы можете создавать индексы TTL для созданных и обновляемых полей по отдельности, но вы не можете создать составной индекс TTL для обоих полей одновременно, а также вы не можете создать индекс TTL для одного и того же поля. field. , который снова создает обычный индекс, но может использоваться как «обычный индекс» для оптимизации сортировки и запросов.