在mongoose(mongodb)中设置集合属性的到期时间

时间:2018-01-15 17:42:23

标签: node.js mongodb mongoose mongoose-schema

我知道,如果我想设置一个具有expires属性的集合的过期时间,如下所示:

new Schema({
  token: {
    type: String,
    required: true
  },
  createdAt: {
    type: Date,
    expires: '10s',
    default: Date.now
  }
});

但是,如何在集合中设置一个属性的过期时间?

例如,我有一个包含用户名,电子邮件和一系列身份验证令牌的架构。我希望在10秒后从创建日期删除每个令牌。我试过了:

new Schema({
  username: {
    type: String,
    required: true
  },
  email: {
    type: String,
    required: true
  },
  tokens: [{
    createdAt: {
      type: Date,
      expires: '10s',
      default: Date.now
    },
    auth: {
      type: String,
      required: true
    },
    token: {
      type: String,
      required: true
    }
  }]
});

但每次删除完整的集合时,都不会删除令牌对象。

1 个答案:

答案 0 :(得分:0)

您可以创建一个单独的集合来保存身份验证令牌,并维护用户和令牌集合之间的一对多关系。

您可以使用insert/update/delete中间件级联pre/post,因此当令牌过期时,用户中的de-reference令牌

用户架构

 const UserSchema =  new Schema({
    username: {
      type: String,
      required: true
    },
    email: {
      type: String,
      required: true
    },    
    tokens: [
       { type: Schema.Types.ObjectId, ref: 'Token' }
      ]    
  });

令牌架构(确保您已在ttl上创建了createdAt索引)

  const TokenSchma = new Schema({
      user : { 
        type: Schema.Types.ObjectId, ref: 'User' 
      },
      createdAt: {
        type: Date,
        expires: '10s',
        default: Date.now
      },
      auth: {
        type: String,
        required: true
      },
      token: {
        type: String,
        required: true
      }
    }
);