DynamoDBSaveExpression在GSI上进行条件检查

10
我想进行更新,但我想添加的条件检查不是基于主表的哈希/范围,而是GSI的。实际上,如果给定属性(即GSI的哈希)已存在,则要使保存失败。例如,在虚构的员工表中,“SSN”是哈希键,并且有一个“EmployeeId”的GSI。这两个属性都需要在整个表格中唯一。在保存员工时,我想确保“SSN”或“EmployeeId”中没有一个已在表格中使用。我可以对表格的哈希,即SSN进行此操作,但无法对GSI的哈希进行操作。这是否有支持?我没有在文档中看到这一点。谢谢!

你能解决这个问题吗? - ufdeveloper
嘿,答案最终对你有用吗?如果有用的话,你应该接受它,这样其他 Stack Overflow 用户就知道它解决了问题。如果你需要微调一些东西或者使用了不同的解决方案,可以留下评论或添加自己的答案,与他人分享知识。 - Matthew Pope
1个回答

8
您所描述的方法即使使用了最新宣布的事务,也无法在DynamoDB中实现。原因是因为您的GSI是最终一致性的,并且可能不反映表中项目的最新状态,因此不能在GSI上使用ConditionExpression。 然而,您可以通过拥有单独的EmployeeId-InUse表来实现类似的功能。这可以是一个简单的单属性表:employeeId。由于这是一个表而不是GSI,因此您可以使用TransactWriteItems请求同时写入EmployeeData和EmployeeId-InUse表。如果事务的任何部分失败,则事务将失败,因此您可以使用ConditionExpression来Prevent Overwrites of an Existing Item以确保如果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时,都要更新EmployeeId-InUse表。此外,请注意,事务将消耗比常规写入多两倍的容量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接