我有一个名为用户的收藏。我想向该集合添加一个用户,但是如果已经存在一个具有相同名称的用户,它将失败。如果创建成功,我想用一些数据初始化它,例如密码哈希。
我不能使用如下更新更新:
name = ...
password_hash = ...
db.users.update({ "name": name }, { "name": name, "hash": password_hash }, upsert=True)
因为这将覆盖现有用户的密码哈希。本质上,我想自动执行以下操作:
name = ...
password_hash = ...
if db.users.find_one({ "name": name }) is None: # Line A
db.users.insert_one({ "name": name, "hash": password_hash }) # Line B
但是我不能使用确切的代码,因为在行A和行B之间可以添加一个name
用户,这意味着我会有两个同名用户。
在创建新用户的情况下,我也不能使用空的upsert
,然后再添加数据,因为可能会在正在创建的用户和正在添加的数据之间查询该数据。即它不是原子的。
我尝试阅读其他SO问题和解答(它们都建议使用无效的upsert
空方法),尝试阅读文档并尝试使用通用Google搜索,但找不到任何东西。我使用的是Python,因此,如果您可以用Python编写答案,那会很好,但是如果您必须用其他语言编写,则请避免回答。
答案 0 :(得分:1)
您可以创建索引并指定该名称为唯一字段。 在这里看看:
https://docs.mongodb.com/manual/core/index-unique/
应该可以解决您的问题。
任何不符合索引的更新/插入操作都会失败。