如何使MongoDB Upsert真正幂等?

如何使MongoDB Upsert真正幂等?,mongodb,upsert,idempotent,Mongodb,Upsert,Idempotent,我想以幂等方式将文档插入MongoDB MongoDB文档提供的解释以及这里的解释是使用upsert=True修饰符 然而,据我所知,这并不能保证幂等性,因为已经存在的文档可以修改 我正在寻找的操作如下: 如果由某个键标识的文档不存在,请插入它 如果具有给定密钥的文档已存在,则可能会发生两种情况: 现有文件和提供的文件完全相同。然后,返回与插入新文档相同的结果 现有文档与提供的文档不同:抛出错误,因为会违反幂等性 MongoDB是否支持这种开箱即用的操作?为什么upsert操作会被标记

我想以幂等方式将文档插入MongoDB

MongoDB文档提供的解释以及这里的解释是使用
upsert=True
修饰符

然而,据我所知,这并不能保证幂等性,因为已经存在的文档可以修改

我正在寻找的操作如下:

  • 如果由某个键标识的文档不存在,请插入它
  • 如果具有给定密钥的文档已存在,则可能会发生两种情况:
    • 现有文件和提供的文件完全相同。然后,返回与插入新文档相同的结果
    • 现有文档与提供的文档不同:抛出错误,因为会违反幂等性

MongoDB是否支持这种开箱即用的操作?为什么upsert操作会被标记为幂等操作,即使它们可能会修改已经存在的文档?

幂等操作意味着可以执行相同的操作两次,并产生相同的效果,就像它只发生过一次一样。名称
upsert
也是一个提示:它是
update
insert
的缩写。这意味着它要么(如果存在)更新现有文档,要么插入新文档。因此:upsert操作被标记为幂等,因为它们是。你对幂等词的解释并不是其他人所用的


您的用例响应。需求是另一回事。在我的理解中,在MongoDB中实现这一点是相当困难的,因为没有可用的通用内置事务机制(至少我最近看到过)。您需要从应用程序中执行类似于两阶段提交的操作。

我个人的意见:使用真正的DB。感谢您指出我对幂等性的错误解释!我找到了W3C的定义:“方法也可以具有“幂等性”的属性,因为(除了错误或过期问题)N>0个相同请求的副作用与单个请求相同。”因此,更新文档是可以的,因为重播更新不会引入新的副作用。