问题描述
我想以幂等的方式将文档插入MongoDB。
MongoDB文档以及此处的SO提供的解释是使用upsert=True
修饰符。
但是,据我了解,这不能保证幂等,因为可以修改已经存在的文档。
我要寻找的操作如下:
- 如果通过某些键标识的文档不存在,请将其插入。
- 如果具有给定密钥的文档已经存在,则可能会发生两件事:
- 现有文档和提供的文档完全相同。然后,返回与插入新文档相同的结果。
- 现有文档与提供的文档有所不同:抛出错误,因为会违反幂等性。
MongoDB是否开箱即用地支持这种操作?为什么upsert操作可能会标记为幂等,即使它们可能会修改已经存在的文档?
解决方法
幂等意味着您可以执行相同的动作两次,并且效果与仅发生一次一样。名称upsert
也是一个提示:它是update
和insert
的缩写。这意味着它将(如果存在)更新现有文档或插入新文档。因此:upsert操作被标记为幂等,因为它们是。您对幂等一词的解释并非所有人都使用。
您的用例响应。需求是另外一回事。以我的理解,在MongoDB中很难做到这一点,因为没有可用的通用内置事务处理机制(至少我上次看过)。您需要在应用程序中执行类似两阶段提交的操作。