我要进行更新,但是我要添加的条件检查不是基于主表的哈希/范围,而是基于GSI。
有效地,如果给定属性(即GSI的哈希)已经存在,我想使保存失败。
例如,在一个假想的雇员表中,“ SSN”是哈希键,并且在“ EmployeeId”上有一个GSI。所有这两个属性都必须是唯一的。在保存员工时,我想确保表中没有使用“ SSN”或“ EmployeeId”。我可以针对表的哈希(即SSN)执行此操作,但不能针对GSI的哈希进行操作。
是否支持?我没有在文档中看到。
谢谢!
答案 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
表。另外,请注意,事务将消耗的容量是常规写入的两倍。