Mongodb разные TTL для каждого документа - PullRequest
0 голосов
/ 25 апреля 2020

насколько я знаю , в настоящее время TTL mongodb управляются индексом expireAfterSeconds и его настройкой для всего документа в коллекции.

так есть ли встроенный способ установить срок действия для одного документа?, Спасибо

1 Ответ

2 голосов
/ 25 апреля 2020

Для каждого документа вы можете установить поле expires и создать следующий индекс:

db.docs.createIndex( { expires:1 }, {expireAfterSeconds: 0 } );

документы внутри этой коллекции будут удалены после того, как время превысит поле с истекшим сроком. Однако это может занять до 60 секунд, так как фоновая задача, выполняемая для удаления документов, выполняется каждые 60 секунд.

Вот пример, хотя ...

Итак, давайте вставим пакет документов, добавив 60 секунд к каждому документу каждый раз, когда мы их добавляем.

> var expires = new Date(); // Gets the current datetime.
> expires.setSeconds(expires.getSeconds() + 60)
1587812623023
> db.docs.insert({expires})
WriteResult({ "nInserted" : 1 })

> expires.setSeconds(expires.getSeconds() + 60)
1587812683023
> db.docs.insert({expires})
WriteResult({ "nInserted" : 1 })

> expires.setSeconds(expires.getSeconds() + 60)
1587812743023
> db.docs.insert({expires})
WriteResult({ "nInserted" : 1 })

> db.docs.find()
{ "_id" : ObjectId("5ea418de00f07c4d6461090b"), "expires" : ISODate("2020-04-25T11:03:43.023Z") }
{ "_id" : ObjectId("5ea418e300f07c4d6461090c"), "expires" : ISODate("2020-04-25T11:04:43.023Z") }
{ "_id" : ObjectId("5ea418e600f07c4d6461090d"), "expires" : ISODate("2020-04-25T11:05:43.023Z") }

Теперь, если мы добавим индекс TTL.

db.docs.createIndex( { expires:1 }, { expireAfterSeconds: 0 } )

Затем мы можем отслеживать нашу коллекцию каждые 60 секунд и видеть, как каждый документ получает удалено.

> new Date()
ISODate("2020-04-25T11:03:28.278Z")
> db.docs.find()
{ "_id" : ObjectId("5ea418de00f07c4d6461090b"), "expires" : ISODate("2020-04-25T11:03:43.023Z") }
{ "_id" : ObjectId("5ea418e300f07c4d6461090c"), "expires" : ISODate("2020-04-25T11:04:43.023Z") }
{ "_id" : ObjectId("5ea418e600f07c4d6461090d"), "expires" : ISODate("2020-04-25T11:05:43.023Z") }

Ничего еще не удалено.

> new Date()
ISODate("2020-04-25T11:04:18.652Z")
> db.docs.find()
{ "_id" : ObjectId("5ea418e300f07c4d6461090c"), "expires" : ISODate("2020-04-25T11:04:43.023Z") }
{ "_id" : ObjectId("5ea418e600f07c4d6461090d"), "expires" : ISODate("2020-04-25T11:05:43.023Z") }

Один документ пропал.

> new Date()
ISODate("2020-04-25T11:05:17.705Z")
> db.docs.find()
{ "_id" : ObjectId("5ea418e600f07c4d6461090d"), "expires" : ISODate("2020-04-25T11:05:43.023Z") }

Другой пропал.

> new Date()
ISODate("2020-04-25T11:06:31.390Z")
> db.docs.find()
>

и в нашей коллекции нет никаких украшений.

...