DocumentDB:"Upsert"有什么意义?

Sim*_*rdo 5 azure-cosmosdb

我正在尝试理解API的这一部分,以便以最有效的方式更新文档.

鉴于以下内容:

  • " Replace"要求文档已存在
  • " Upsert"不要求文档存在,但如果文档ID要进行更新则需要文档ID.
  • 这两个命令都不能进行部分文档更新,这意味着我无法想到任何我不必先查询文档,然后对受影响的属性进行更改,然后替换/ upsert整个文档的情况.

如果我总是要查询文档第一无论如何,以避免歼灭未传回任何UPSERT属性值/替换,我不能做了部分更新,什么是兼具UPSERT并更换点?

我错过了这两个命令的预期用例吗?

Jes*_*ter 10

您已经描述了两者之间的主要差异.如果文档尚不存在,Upsert将创建一个文档,否则将覆盖它.替换要求文档已存在,然后覆盖它.使用哪个是您的应用程序的关注点.在某些情况下,您可能希望使用替换,因为如果文档尚不存在,则会在业务逻辑中构成错误.否则它们非常相似.

我知道缺乏能够进行部分更新可能会让人感到沮丧.但是,Cosmos以存储过程的形式提供了一个功能强大的服务器端编程模型,您可以使用Javascript编写.您可以轻松创建一个接收部分文档的SPROC,并仅更新或添加新的或更改的属性,这些属性将为您提供最终要查找的功能.

  • 我认为限制数据库中“业务”逻辑的数量很重要。该代码往往非常特定于所讨论的数据库引擎(在本例中为 CosmosDB)。在一个规模相当大的系统中,当您想要更改运行业务逻辑的位置时,与数据库引擎的绑定可能是一个严重的限制因素。截至 2021 年 10 月,我正在与一位客户合作,该客户正在努力从数据库引擎中获取 700,000 行代码以在其他地方运行。对于他们来说,这是多年的努力。不过,添加部分更新支持可能是罕见的例外之一。 (3认同)
  • 这超出了这个问题的范围。如果您赞成并接受这个问题,然后就编写存储过程以允许部分更新文档提出不同的问题,我可以尝试在那里为您提供帮助 (2认同)