我有一个叫做用户的集合。我想向该集合中添加一个用户,但如果已经存在同名用户,则该集合将失败。如果创建成功,我想用一些数据初始化它,例如密码哈希。
我不能使用如下更新upsert:
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
但是,我不能使用确切的代码,因为
name
可以在A行和B行之间添加,这意味着我将拥有两个同名用户。
我也不能用空的
upsert
然后在创建新用户的情况下添加数据,因为可以在正在创建的用户和正在添加的数据之间查询该数据。也就是说,它不是原子的。
我试过阅读其他的问题和答案
更新插入
方法不起作用),尝试过阅读文档,尝试过一般性的谷歌搜索,但没有找到任何东西。我使用的是python,所以如果你能用python写一个答案,那就很好了,但是如果你必须用另一种语言来写的话,不要避免回答。