用户集合的TTL索引

时间:2013-07-29 19:20:23

标签: node.js mongodb node-mongodb-native

我有'用户'集合,其结构如下:

_id: ObjectId(...),
name: 'Erik',
email: 'erik@mail.com'

我需要通过电子邮件使用注册确认,因此我需要您的建议以实现以下方法:

  • 在该集合上为确认字段创建TTL索引:

    db.users.ensureIndex({"confirm": 1}, {expireAfterSeconds: 60*60*1000});
    
  • 当用户注册时,请使用confirm确认为当前时间:

     db.users.create({name: 'name', email: 'email', confirm: new Date()});
    
  • 当用户发送确认您帐户的请求时,我们将其确认字段更新为true,因为我们不希望该用户被TTL索引删除:

    db.users.update({email:req.param('email'),{confirm:true}});

我想知道以下内容:

  1. 上述方法是否正确。
  2. 上述方法是否安全

1 个答案:

答案 0 :(得分:1)

关于正确性:根据the documentation,当由TTL索引索引的字段不是有效的BSON日期时,文档将永不过期,因此将其设置为true将阻止其过期。所以这会奏效。但请记住,当文档过期时,它将在没有跟踪的情况下消失,因此您无法判断尝试确认的用户是否已过期或从未存在过。

但是更新命令中存在错误。除了您关闭}错误之外,此更新还将使用仅包含字段confirm:true的新文档替换整个文档。如果要保留文档的所有其他字段,请使用$set operator

db.users.update({email: req.param('email')}, {$set:{confirm:true}});

另请注意,只要电子邮件字段是唯一的,此更新才能正常运行,因此请确保您在电子邮件中拥有唯一索引。

关于安全性:TTL是作为后台作业实现的,每60秒计划一次,并删除它找到的所有文档。此作业是低优先级的,因此数据库可以在繁忙时推迟它。这意味着您不能在1000小时后完全依赖完全的到期时间,但我的猜测是,对于您的特定用例,准确性并不重要。