You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Mongoose中配置MongoDB TTL自动删除未验证用户

实现Mongoose Schema配置TTL自动删除未验证用户

核心方案

通过带部分过滤条件的TTL索引实现:只对emailVerified: false的未验证用户生效,从注册时间起24小时后自动删除;用户验证后将emailVerified设为true,该文档会自动脱离TTL索引的监控范围,不会被删除。

具体代码实现(userModel.js)

const mongoose = require('mongoose');

const userSchema = new mongoose.Schema({
  email: { type: String, required: true, unique: true },
  emailVerified: { type: Boolean, default: false },
  tokens: { type: [String], default: [] },
  // 其他用户字段(如密码哈希、昵称等)
  createdAt: { type: Date, default: Date.now }
});

// 创建带partial过滤的TTL索引
userSchema.index(
  { createdAt: 1 },
  {
    expireAfterSeconds: 86400, // 24小时(单位:秒)
    partialFilterExpression: { emailVerified: false } // 仅对未验证用户生效
  }
);

module.exports = mongoose.model('User', userSchema);

关键逻辑说明

  1. TTL索引基础:以createdAt字段为时间基准,设置expireAfterSeconds: 86400(24小时),MongoDB会自动扫描并删除超过有效期的文档。
  2. 部分过滤条件:partialFilterExpression限定索引仅作用于emailVerified: false的文档,解决了验证后用户被误删的问题。
  3. 验证后的自动失效:当用户完成邮箱验证时,执行更新操作将emailVerified设为true,该文档立即不再符合partial过滤条件,TTL索引会停止对它的监控,不会被删除。

验证测试技巧

如果需要快速验证功能是否正常,可以临时将expireAfterSeconds设为60(1分钟),注册一个未验证用户,等待1分钟后查看MongoDB集合是否自动删除该文档。

注意事项

  • 确保MongoDB版本≥3.2(partial索引的最低支持版本)。
  • 不要同时使用Schema字段的expires属性和手动创建的TTL索引,避免重复创建索引导致冲突。
  • 验证时的更新操作需确保emailVerified被正确设为true,可以配合清除tokens字段(如await User.findByIdAndUpdate(userId, { $set: { emailVerified: true }, $unset: { tokens: "" } }))。

内容的提问来源于stack exchange,提问作者Deep

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 22:52:36