0

我有具有以下结构的“用户”集合:

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

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

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

    db.users.ensureIndex({"confirm": 1}, {expireAfterSeconds: 60*60*1000});
    
  • 当用户注册时,然后创建这个并确认为当前时间:

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

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

我想知道以下内容:

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

1 回答 1

1

关于正确性:根据文档,当 TTL 索引索引的字段不是有效的 BSON 日期时,文档将永远不会过期,因此将其设置为 true 将防止它过期。所以这会起作用。但是请记住,当文档过期时,它会消失得无影无踪,因此您无法判断尝试确认过期的用户是否一开始就不存在。

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

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

另外请记住,只要电子邮件字段是唯一的,此更新才会可靠地工作,因此请确保您在电子邮件上拥有唯一的索引。

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

于 2013-07-29T19:50:48.037 回答