azure - 如何在 CosmosDB 的分区中执行和应用最多(或完全)一个具有 true 标志的实体?
问题描述
我在一个分区有一小部分文件。我想在分区中将其中一个实体标记为启用。启用由将isEnabled
标志设置为 true 的文档指示。当文档被更新或插入并isEnabled
设置为 true 时,在该事务中所有其他文档都应该是isEnabled:false
. 如果正在删除文档或从isEnabled
true 转换为 false,则如果剩余任何记录,则最后修改的文档应变为启用。分区永远不应该进入不一致的状态。除非有零个文档,否则应该只能有一个启用的文档
是否有实现这种状态的模式?我尝试了一些方法,但它们似乎都有一些漏洞。
解决方案
使用唯一键。并调用它disabledAt
而不是isEnabled
.
当您需要切换活动文档时,您可以打开一个事务。
- 开始交易
- 在旧文档上,设置
disabledAt
为当前 UTC 日期时间或刻度 - 在新文档上,设置
disabledAt
为 null 或将其删除 - 提交事务
您可以通过 SDK 或 User-Defined-Functions 进行交易。您可能还可以使用post-triggers,因为它们在同一个事务中运行。
这将保证您只有一个没有价值的文档disabledAt
。它之所以有效,是因为只要您留在单个分区内,您就可以保证一致性的事务。
推荐阅读
- c# - 枚举舞台上的所有对象 - 统一
- python - 生成带有限定符的查询字符串
- microservices - 没有云的负载平衡文件访问
- javascript - 将 Pickle 对象转换为 JS 可读的代码?
- sql - 分区 Athena 表中的子查询
- entity-framework - 如何做 EntityFramework InsertOrUpdateOrDelete
- python - MongoDb 4.2 使用聚合管道从使用嵌套数组元素选择的正常更新进行更新
- powershell - 如何使用 PowerCLI 列出 BIOS 主要/次要版本?
- java - 当我在 VSCode 中运行时程序运行良好,但是 maven 扩展构建的包没有运行
- automated-tests - 在函数中使用包含的空手道 DSL 过滤器数组