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

如何通过Mongoose在指定时间后移除MongoDB文档中的单个Token?

实现Mongoose User Schema中单个Token的自动过期移除

你的思路完全没问题——给数组里的每个token对象添加带expires属性的createdAt字段,是实现单个token自动过期删除的正确方向,下面是具体的实现步骤和注意事项:

1. 更新User Schema定义

直接修改你的userSchema,给tokens数组内的每个子文档补充createdAt字段,通过expires设置过期时长(比如你需要的30秒就设为30):

const userSchema = new mongoose.Schema({
  login: { type: String },
  email: { type: String },
  password: { type: String },
  tokens: [
    {
      access: { type: String, required: true },
      token: { type: String, required: true },
      createdAt: { 
        type: Date, 
        default: Date.now, 
        expires: 30 // 过期时间设为30秒,单位是秒
      }
    }
  ]
});

2. 确保TTL索引生效

Mongoose会自动为带expires属性的字段创建TTL(Time To Live)索引,但有几个细节要留意:

  • TTL索引是MongoDB后台定期执行的清理任务,默认每60秒运行一次,所以token不会刚好在30秒整被删除,最多会延迟60秒左右,这是正常的MongoDB机制。
  • 如果集合已经提前创建过,可能需要手动触发索引创建来确保生效:
    const User = mongoose.model('User', userSchema);
    // 手动确认索引创建
    User.createIndexes()
      .then(() => console.log('TTL索引创建成功'))
      .catch(err => console.error('索引创建失败:', err));
    

3. 添加Token的常规操作

给用户新增token时,不需要手动设置createdAt,因为已经配置了default: Date.now,Mongoose会自动为新token填充当前时间:

// 示例:为用户添加新的认证token
const user = await User.findById(userId);
user.tokens.push({
  access: 'auth',
  token: '你的生成的token字符串'
});
await user.save();

4. 验证过期效果

你可以通过以下步骤确认功能正常:

  1. 创建一个带有token的用户文档。
  2. 等待1分钟左右(包含TTL任务的延迟时间)。
  3. 查询该用户,检查tokens数组中对应的token是否已被自动移除。

注意:如果你的MongoDB版本低于3.2,TTL索引可能不支持数组内的子文档字段,建议使用4.0及以上版本的MongoDB。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:59:54