TTL пользователей в MongoDB
Решая задачу по выставлению TTL пользователей в MongoDB столкнулся с парой моментов ее специфики.
Часть первая, концептуальная:
В MongoDB используется концепция, что все есть документ. Это касается и пользователей. Вы можете создавать пользователя внутри ваших отдельных баз и будете видеть его там. Это имеет смысл с точки зрения безопасности - пользователь будет видеть только базы, к которым имеет доступ, и не будет видеть вообще базу admin. Но при этом, де факто, пользователь как документ не создается в этой базе, он будет создан в базе admin, в коллекции system.users
Скажем у нас есть база example. Выполняя следующие команды
use example db.createUser({user: "test", pwd: "mypassword", roles: [{role: "readWrite", db: "example"}]})
По итогу мы создадим пользователя, что как сущность через клиентов будем видеть в базе example, но де факто документ, описывающий пользователя, будет хранится в базе admin, коллекция system.users, а ID документа будет example.user
Часть вторая, практическая:
TTL мы выставляем не столько на пользователя, как сущность, а на документ. То есть применять можно его к любым документам, в рамках указанной коллекции с нужным полем. А теперь на деле, на примере именно пользователей:
Используем системную базу admin
use admin
Мы создаем кэш, в котором будет указан срок жизни документа и имя поля, на которое он смотрит, оно совпадает с именем кэша:
db.system.users.createIndex({ "expirationCreateDate": 1}, { expireAfterSeconds: 259200 })
Где у нас:
db.system.users - коллекция, где у нас хранятся документы с пользователями
expirationCreateDate - имя кэша, систем будет ориентировать на это поле в документах при оценке срока жизни документа.
expireAfterSeconds: 259200 - количество секунд, после которой документ должен быть удален. В данном случае это трое суток.
Теперь мы добавляем нужному нам пользователю, де факто документу, нужное поле, совпадающее с кэшем:
db.system.users.update({_id: "example.user"}, {$set: {expirationCreateDate: new Date()}})
Где у нас:
_id: "example.user" - отсылка к ID документа, в данном случае документа нашего пользователя
$set: {expirationCreateDate: new Date()} - задаем новое поле, совпадающее с именем кэша, куда он и будет смотреть, при этом в нее мы задаем текущую дату-время момента, когда создали это поле. Именно от этой даты-время и будет считаться TTL
Все. Как только пройдет трое суток с момента, когда добавили нужное поле в документ, этот документ будет удален.