社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  MongoDB

如果MongoDB中不存在文档,则创建该文档,并自动向其添加字段[重复]

Llew Vallis • 5 年前 • 250 次点击  

这个问题已经有了答案:

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

我不能使用如下更新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写一个答案,那就很好了,但是如果你必须用另一种语言来写的话,不要避免回答。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/30815
 
250 次点击  
文章 [ 1 ]  |  最新文章 5 年前
Mazki516
Reply   •   1 楼
Mazki516    5 年前

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

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

这应该能解决你的问题。

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