TTL-индекс MongoDB не удаляет просроченные документы - PullRequest
4 голосов
/ 05 мая 2019

Я пытаюсь создать коллекцию с именем ttl, и с помощью индекса TTL срок действия документов в этой коллекции истекает через 30 секунд.

Я создал коллекцию, используя mongoengine, вот так:

class Ttl(Document):
    meta = {
        'indexes': [
            {
                'name': 'TTL_index',
                'fields': ['expire_at'],
                'expireAfterSeconds': 0
            }
        ]
    }

    expire_at = DateTimeField()

Индекс создан, и Robo3T показывает его, как и ожидалось.

Фактические документы вставляются в собрание, используя также mongoengine:

current_ttl = models.monkey.Ttl(expire_at=datetime.now() + timedelta(seconds=30))
current_ttl.save()

Сохранение выполнено успешно (документ вставлен в БД), но срок его действия не истекает!

Как мне истечь срок действия документов?

Я также добавляю сюда содержимое коллекции на случай, если сохраню их неправильно.Это результаты выполнения db.getCollection('ttl').find({}):

/* 1 */
{
    "_id" : ObjectId("5ccf0f5a4bdc6edcd3773cd6"),
    "created_at" : ISODate("2019-05-05T19:31:10.715Z")
}

/* 2 */
{
    "_id" : ObjectId("5ccf121c0b792dae8f55cc80"),
    "expire_at" : ISODate("2019-05-05T19:41:08.220Z")
}

/* 3 */
{
    "_id" : ObjectId("5ccf127d6729084a24772fad"),
    "expire_at" : ISODate("2019-05-05T19:42:47.522Z")
}

/* 4 */
{
    "_id" : ObjectId("5ccf15bab124a97322da28de"),
    "expire_at" : ISODate("2019-05-05T19:56:56.359Z")
}

Сами индексы согласно результатам db.getCollection('ttl').getIndexes():

/* 1 */
[
    {
        "v" : 2,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "monkeyisland.ttl"
    },
    {
        "v" : 2,
        "key" : {
            "expire_at" : 1
        },
        "name" : "TTL_index",
        "ns" : "monkeyisland.ttl",
        "background" : false,
        "expireAfterSeconds" : 0
    }
]

My db.version() равно 4,0.8 и работает на Ubuntu 18.04.

1 Ответ

2 голосов
/ 07 мая 2019

Проблема с:

current_ttl = models.monkey.Ttl(expire_at=datetime.now() + timedelta(seconds=30))

, что должно быть

current_ttl = models.monkey.Ttl(expire_at=datetime.utcnow() + timedelta(seconds=30))
...