2016-11-04 48 views
3

我正尝试使用唯一的电子邮件创建新帐户。其中一个选项是检查是否存在具有相同电子邮件的帐户。如果没有,请创建新帐户。插入项目原子性

Account 
    .find({email: req.body.email}) 
    .exec((err, accounts) => { 
     //Try to find an account that have the same email 
     if (!accounts.length) { 
      //If none is found create a new account with this email 
      var account = new Account({email: req.body.email}); 
      account.save(); 
     } 
    }); 

这种方法的问题是,我不清楚这是否是原子安全的。如果多个用户同时尝试使用同一封电子邮件创建新帐户,该怎么办?这会毁了我的数据库的一致性吗?


我听说过 独特选项 SchemaType
我应该选择那个选项吗?
正在使用猫鼬内置验证一个必须?其他选项?
上面的代码被认为是不好的做法?

回答

3

这在MongoDB中不会是原子级安全的。但是,您可以在电子邮件字段中使用唯一的索引。这会导致插入失败,如果它已被使用或者如果有人刚插入它并发。

如果您打算使用分片,这可能会成为一个问题,因为只有分片键支持唯一索引。

+0

我该如何处理唯一索引错误?他们的签名是什么?也许我指向一些文档? – rocketspacer

+2

错误的类型可能取决于您的数据库驱动程序。我认为猫鼬不会包装错误,所以你会得到一个'MongoError:E11000重复键错误索引'。这可能有所帮助:https://github.com/Automattic/mongoose/issues/1225 – Erik