Назад | Перейти на главную страницу

Создание индекса TTL для числового типа данных

Я пытаюсь создать индекс TTL для удаления документов старше 30 минут в поле «сгенерировано» для приведенного ниже образца документа.

образец документа: {"_id": ObjectId ("5850308c077b3d1ccc11cef0"), "created": NumberLong ("1481650316760")}

Вопрос 1) возможно ли это сделать, поскольку поле «сгенерированное» не является типом даты 2) Есть ли альтернативный способ добиться этого без изменения структуры документа

возможно ли это сделать, поскольку поле "сгенерировано" не является типом даты

Как и в MongoDB 3.4, Индексы TTL поддерживаются только поля со значениями даты BSON:

If the indexed field in a document is not a date or an array that holds
date values, the document will not expire.

Есть ли альтернативный способ добиться этого без изменения структуры документа

Если вы хотите поддерживать срок действия документов на основе типов полей или сравнений за пределами того, что предусмотрено во встроенном индексе TTL, вы всегда можете написать свой собственный сценарий и запланировать его, используя что-то вроде cron утилита (Операционные системы Linux / Unix) или Диспетчер задач (Windows).

В этом случае ваш сценарий удалит все документы, в которых generated Значение NumberLong старше, чем желаемый срок действия (например, 30 минут). Запрос в mongo оболочка будет похожа на:

db.collection.remove(
    {
        generated: {
            // Expire documents older than half hour: 30 minutes * 60 seconds * 1000 ms
            $lt: (Date.now() - (30 * 60 * 1000))
        }
    }
)

Вы можете написать это на своем любимом языке приложения, передать его как .js файл в mongo shell или передать код JavaScript в mongo оболочка с использованием --eval. Для получения дополнительной информации см. Написание скриптов для оболочки mongo в руководстве MongoDB.