如果 MongoDB 中不存在则创建文档并自动向其添加字段

Create document if it doesn't exist in MongoDB and add fields to it atomically

我有一个名为用户的集合。我想将一个用户添加到该集合中,但如果已经存在同名用户,它应该会失败。如果创建成功,我想用一些数据初始化它,例如密码哈希。

我无法使用如下更新更新插入:

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 然后在创建新用户的情况下添加数据,因为在创建用户和添加数据之间可能会查询该数据。 IE。它不是原子的。

我试过阅读其他 SO 问题和答案(它们都建议空的 upsert 方法无效),尝试阅读文档并尝试过一般谷歌搜索但无法找到任何东西。我正在使用 Python 所以如果你能用 Python 写一个答案那会很好但是如果你必须用不同的语言写它也不要避免回答。

您可以创建索引并指定名称为唯一字段。 看看这里:

https://docs.mongodb.com/manual/core/index-unique/

应该可以解决您的问题。

任何不符合索引的更新/插入操作都会失败。