5

我想进行更新,但我想添加的条件检查不是基于主表的哈希/范围,而是基于 GSI。

实际上,如果给定的属性(即 GSI 的哈希)已经存在,我希望保存失败。

例如,在一个虚构的员工表中,“SSN”是哈希键,“EmployeeId”上有一个 GSI。这两个属性都必须是独一无二的。在保存员工时,我想确保“SSN”或“EmployeeId”都没有在表中使用。我可以为表的散列(即 SSN)做到这一点,但不能为 GSI 的散列做到这一点。

是否支持?我在文档中没有看到。

谢谢!

4

1 回答 1

5

即使使用新宣布的事务,您描述的方法也无法使用 DynamoDB。原因是您的 GSI 最终是一致的,并且可能无法反映表中项目的最新状态,因此不能在 GSI 上使用 ConditionExpression。

但是,您可以通过使用单独的 EmployeeId-InUse 表来实现类似的功能。它可以像单个属性一样简单:employeeId. 由于这是一个表而不是 GSI,因此您可以使用TransactWriteItems请求同时写入 EmployeeData 和 EmployeeId-InUse 表。如果事务的任何部分失败,则事务将失败,因此您可以使用 ConditionExpression防止覆盖现有项目,以确保在 SSN 或 EmployeeId 已经存在时事务将失败。

这是您的 dynamodb 请求的“TransactItems”部分对此的示例。

“TransactItems”: [
    {
        “Put” : {
            “ConditionExpression” : “attribute_not_exists(ssn)”,
            “Item” : {
                ... employee data goes here ...
             },
            “TableName”: “EmployeeData”
        }
    },
    {
        “Put” : {
            “ConditionExpression” : “attribute_not_exists(employeeId)”,
            “Item” : {
                “employeeId”: {
                      “S” : “Employee1457”
                }
            },
            “TableName”: “EmployeeIDs-InUse”
        }
    }
]

这里有几件事你需要注意。确保EmployeeId-InUse每次添加或删除员工时更新表,以及更新与给定 SSN 关联的employeeId。另外,请注意,事务将消耗两倍于常规写入的容量。

于 2018-12-14T11:21:00.000 回答