插入项目原子性

时间:2016-11-04 23:27:04

标签: mongodb mongoose

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

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 中的唯一选项。
我应该选择那个选项吗? 是否必须使用mongoose内置验证?其他选择?
以上代码是否被视为不良做法?

1 个答案:

答案 0 :(得分:3)

这在MongoDB中不是原子安全的。但是,您可以在电子邮件字段中使用唯一索引。如果插入已经使用或者有人只是同时插入它,这将导致插入失败。

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