DynamoDBSaveExpression具有对GSI的条件检查

时间:2018-11-01 00:45:28

标签: amazon-dynamodb secondary-indexes dynamodb-queries

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

有效地,如果给定属性(即GSI的哈希)已经存在,我想使保存失败。

例如,在一个假想的雇员表中,“ SSN”是哈希键,并且在“ EmployeeId”上有一个GSI。所有这两个属性都必须是唯一的。在保存员工时,我想确保表中没有使用“ SSN”或“ EmployeeId”。我可以针对表的哈希(即SSN)执行此操作,但不能针对GSI的哈希进行操作。

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

谢谢!

1 个答案:

答案 0 :(得分:0)

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

但是,您可以通过拥有单独的EmployeeId-InUse表来实现类似的功能。它可能像一个单一属性一样简单:employeeId。由于这是一个表而不是GSI,因此您可以使用TransactWriteItems请求同时写入EmployeeData和EmployeeId-InUse表。如果事务的任何部分失败,则事务将失败,因此您可以对Prevent Overwrites of an Existing Item使用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”
        }
    }
]

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