如何在Prisma中实现MongoDB的TTL文档自动过期删除?
Prisma 实现 MongoDB TTL 自动删除过期令牌方案
Prisma 本身没有像 Mongoose 那样内置专门的 TTL 配置,但完全可以借助 MongoDB 原生的 TTL 索引机制来实现过期令牌自动删除的需求,具体有两种可行方式:
1. 手动在 MongoDB 中创建 TTL 索引
直接通过 MongoDB Shell 或可视化工具(如 Compass)连接数据库,针对 Token 集合的过期时间字段创建 TTL 索引。假设你的集合名为 tokens,过期时间字段为 expiresAt,执行以下命令:
db.tokens.createIndex({ expiresAt: 1 }, { expireAfterSeconds: 0 })
这里 expireAfterSeconds: 0 表示以 expiresAt 字段存储的具体时间作为过期触发点,而非固定时长后过期。
2. 通过 Prisma Schema 配置生成 TTL 索引
在 Prisma Schema 中定义 Token 模型时,直接通过索引的 MongoDB 扩展参数配置 TTL 规则,这样在执行数据库同步命令时会自动创建对应的索引:
model Token { id String @id @default(auto()) @map("_id") @db.ObjectId token String @unique userId String @db.ObjectId expiresAt DateTime // 存储令牌的过期时间 // 配置带TTL的索引 @@index([expiresAt], map: "expiresAt_ttl", db: { expireAfterSeconds: 0 }) }
配置完成后,运行 prisma db push(无迁移需求时)或 prisma migrate dev(需要生成迁移文件时),Prisma 会自动在 MongoDB 中创建该 TTL 索引。
关键注意事项
- 确保
expiresAt字段存储的是未来的日期时间,MongoDB 的 TTL 后台进程会定期(默认每分钟一次)扫描并删除过期文档,删除操作存在轻微延迟属于正常现象。 - 可以通过
db.tokens.getIndexes()命令验证 TTL 索引是否成功创建。
内容的提问来源于stack exchange,提问作者angel_dust
相关产品推荐
相关产品推荐

