mongodb - 插入项原子性

标签 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 中的unique 选项。
我应该改用那个选项吗?
必须使用 mongoose 内置验证吗?其他选择?
上面的代码被认为是不好的做法吗?

最佳答案

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

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

关于mongodb - 插入项原子性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40433092/

相关文章:

java - 从mongo集合中检索数据collection.find(query)

mongodb - db.mydb.find({tag :'java' }).count() 和 db.mydb.count({tag :'java' }) 在 mongodb 中有什么区别

node.js - 动态查询 MongoDB

node.js - Mongoose 查询改变对象顺序

mysql - Mongoose/Mongodb 迁移到 MySQL

node.js - Mongoose 映射中的类型检查

node.js - 客户应该为每个集合或每个文档制作一个变更流吗?

node.js - MongoDB - $nin 聚合运算符无效

node.js - Mongoose - 按标准在子文档中查找

node.js - Mongoose 聚合 "$sum"子文档中的行