【问题标题】:In DynamoDb, is there a way to atomically check a secondary index for an item before writing it?在 DynamoDb 中,有没有办法在编写项目之前自动检查项目的二级索引?
【发布时间】:2021-02-02 01:28:22
【问题描述】:

我有一个这样的对象:

{
     "id": (UUID generated at call time)
     "referenceId": (Foreign key for another system) 
     "referenceType": (enum) 
}

主索引只是

  • 主键:id

我有一个二级索引,比如

  • 主键:referenceId
  • 辅助键:referenceType

所以我想做的就是用referenceId和referenceType查询secondary索引,如果是空的,就把记录写到表中。

问题是,条件表达式只能检查您正在查询的同一索引。我研究了 DynamoDb 事务,但他们说你不能让两个事务针对同一个项目。

有没有办法让它工作?

【问题讨论】:

    标签: amazon-dynamodb primary-key secondary-indexes


    【解决方案1】:

    如果我正确理解您的问题,您的商品具有三个属性:idreferenceIdreferenceType。您还定义了一个具有复合主键referenceIdreferenceType 的全局二级索引。

    假设所有这些属性都是同一个项目的一部分,您应该不需要在决定写入表之前阅读二级索引。相反,您可以在该项目上尚不存在referenceIdreference type 的条件下执行PUT 操作。

    ddbClient.putItem({
        "TableName": "YOUR TABLE NAME",
        "Item": { "PK": "id" },
        "ConditionExpression": "attribute_exists(referenceId) AND attribute_exists(referenceType)"
      })
    

    您可能还想在DynamoDB condition expressions 上查看这篇精彩的文章。

    【讨论】:

      【解决方案2】:

      据我了解,您的表 PK 是“在调用时”生成的,因此对于具有相同参考 ID 和参考类型的两个不同请求,它会有所不同。

      既然如此,你的答案是否定的。

      如果您需要由外部系统设置的键的唯一性,您应该考虑为您的 DDB 表使用相同的键或它的一些混搭。

      或者,修改外部系统以设置给定参考 ID 和类型的 UUID。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-18
        • 2016-02-07
        • 2017-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多