首页 > 解决方案 > 如何在 CosmosDB 的分区中执行和应用最多(或完全)一个具有 true 标志的实体?

问题描述

我在一个分区有一小部分文件。我想在分区中将其中一个实体标记为启用。启用由将isEnabled标志设置为 true 的文档指示。当文档被更新或插入并isEnabled设置为 true 时,在该事务中所有其他文档都应该是isEnabled:false. 如果正在删除文档或从isEnabled​​true 转换为 false,则如果剩余任何记录,则最后修改的文档应变为启用。分区永远不应该进入不一致的状态。除非有零个文档,否则应该只能有一个启用的文档

是否有实现这种状态的模式?我尝试了一些方法,但它们似乎都有一些漏洞。

标签: azurenosqlazure-cosmosdb

解决方案


使用唯一键。并调用它disabledAt而不是isEnabled.

当您需要切换活动文档时,您可以打开一个事务

  1. 开始交易
  2. 在旧文档上,设置disabledAt为当前 UTC 日期时间或刻度
  3. 在新文档上,设置disabledAt为 null 或将其删除
  4. 提交事务

您可以通过 SDK 或 User-Defined-Functions 进行交易。您可能还可以使用post-triggers,因为它们在同一个事务中运行。

这将保证您只有一个没有价值的文档disabledAt。它之所以有效,是因为只要您留在单个分区内,您就可以保证一致性的事务。


推荐阅读