如何使用猫鼬打开和关闭TTL索引?

时间:2019-07-12 08:41:42

标签: javascript node.js mongodb mongoose

我想在我的应用程序上创建一个用户帐户,如果该用户尚未确认其帐户,请在经过一定时间后将该用户删除,如果该用户已确认其帐户,则将TTL关闭。

这是我的架构:

const mongoose = require('mongoose')
const Schema = mongoose.Schema

const UserSchema = new Schema({
  name: {
    type: String,
    required: true
  },
  email: {
    type: String,
    required: true
  },
  password: {
    type: String,
    required: true
  }
  ,
  isConfirmed: {
    type: Boolean
  },
  code: {
    type: String
  },
  createdAt: {
    type: Date,
    expires: 3600,
    default: Date.now
  }
})

module.exports = User = mongoose.model('users', UserSchema)

1 个答案:

答案 0 :(得分:1)

由于您已经在TTL index字段中添加了createdAt,因此可以通过在成功进行帐户确认时删除createdAt字段来轻松地将其关闭。

如果文档具有createdAt值且早于指定时间,则将其删除。但是,如果您在帐户确认时删除该字段,则不会删除该字段。因此,您需要删除帐户确认中的createdAt字段。

如果您想保留createdAt字段,则可以在TTL index之类的某些临时字段上添加expireAfter,并在帐户确认时将其删除。

  expireAfter: {
    type: Date,
    expires: 3600,
    default: Date.now
  }

帐户确认后。

User.findOneAndUpdate({_id : user_id},{$unset : {expireAfter:1}})

摘自官方文档:

  

MongoDB将自动从   文档的createdAt值早于   在expireAfterSeconds中指定的秒数(在您的情况下为expires)。

有关更多信息,请阅读MongoDB TTL index docs