如何使 MongoDB Upsert 真正幂等?
How to make a MongoDB Upsert truly idempotent?
我想以幂等方式将文档插入 MongoDB。
MongoDB 文档以及 SO 上提供的解释是使用 upsert=True
修饰符。
但是,据我了解,这并不能保证幂等性,因为可以修改已经存在的文档。
我要找的操作如下:
- 如果由某个键标识的文档不存在,请插入它。
- 如果具有给定键的文档已经存在,则可能会发生两种情况:
- 现有文档与提供的文档完全相同。然后,return 与插入新文档相同的结果。
- 现有文档与提供的文档不同:抛出错误,因为会违反幂等性。
MongoDB 是否支持这种开箱即用的操作?为什么更新插入操作被标记为幂等,即使它们可能会修改已经存在的文档?
幂等性意味着您可以执行相同的操作两次,并且具有与只发生一次相同的效果。 upsert
这个名字也是一个暗示:它是 update
和 insert
的缩写。这意味着它将(如果存在)更新现有文档或插入新文档。所以:upsert 操作被标记为幂等,因为它们 是 。你对幂等这个词的解释不是其他人使用的。
您的用例。要求是另外一回事。据我了解,在 MongoDB 中很难做到这一点,因为没有可用的通用内置事务机制(至少我最近看过)。您需要从您的应用程序中执行类似 two-phase 提交的操作。
我想以幂等方式将文档插入 MongoDB。
MongoDB 文档以及 SO 上提供的解释是使用 upsert=True
修饰符。
但是,据我了解,这并不能保证幂等性,因为可以修改已经存在的文档。
我要找的操作如下:
- 如果由某个键标识的文档不存在,请插入它。
- 如果具有给定键的文档已经存在,则可能会发生两种情况:
- 现有文档与提供的文档完全相同。然后,return 与插入新文档相同的结果。
- 现有文档与提供的文档不同:抛出错误,因为会违反幂等性。
MongoDB 是否支持这种开箱即用的操作?为什么更新插入操作被标记为幂等,即使它们可能会修改已经存在的文档?
幂等性意味着您可以执行相同的操作两次,并且具有与只发生一次相同的效果。 upsert
这个名字也是一个暗示:它是 update
和 insert
的缩写。这意味着它将(如果存在)更新现有文档或插入新文档。所以:upsert 操作被标记为幂等,因为它们 是 。你对幂等这个词的解释不是其他人使用的。
您的用例。要求是另外一回事。据我了解,在 MongoDB 中很难做到这一点,因为没有可用的通用内置事务机制(至少我最近看过)。您需要从您的应用程序中执行类似 two-phase 提交的操作。