Amazon dynamodb GSI上带条件检查的DynamoDBSaveExpression
我想进行更新,但我想添加的条件检查不是基于主表的哈希/范围,而是基于GSI 实际上,如果给定属性(即GSI的哈希)已经存在,我希望保存失败 例如,在一个虚构的employees表中,“SSN”是散列键,“EmployeeId”上有一个GSI。这两个属性都必须是唯一的。在保存员工时,我希望确保表中没有使用“SSN”或“EmployeeId”。我可以对表的散列(即SSN)执行此操作,但不能对GSI的散列执行此操作 支持吗?我在文件中没有看到这一点Amazon dynamodb GSI上带条件检查的DynamoDBSaveExpression,amazon-dynamodb,secondary-indexes,dynamodb-queries,Amazon Dynamodb,Secondary Indexes,Dynamodb Queries,我想进行更新,但我想添加的条件检查不是基于主表的哈希/范围,而是基于GSI 实际上,如果给定属性(即GSI的哈希)已经存在,我希望保存失败 例如,在一个虚构的employees表中,“SSN”是散列键,“EmployeeId”上有一个GSI。这两个属性都必须是唯一的。在保存员工时,我希望确保表中没有使用“SSN”或“EmployeeId”。我可以对表的散列(即SSN)执行此操作,但不能对GSI的散列执行此操作 支持吗?我在文件中没有看到这一点 谢谢 您描述的方法在使用DynamoDB时是不可能的
谢谢 您描述的方法在使用DynamoDB时是不可能的,即使在新宣布的事务中也是如此。原因是您的GSI最终是一致的,可能无法反映表中项目的最新状态,因此不能在GSI上使用ConditionExpression 但是您可以通过在使用表中使用单独的EmployeeId来实现类似的功能。它可以像单个属性一样简单:
employeeId
。因为这是一个表而不是GSI,所以您可以使用请求同时向EmployeeData和EmployeeId写入使用表。如果事务的任何部分失败,则事务将失败,因此您可以使用ConditionExpression来确保如果SSN或EmployeeId已经存在,则事务将失败
下面是dynamodb请求的“TransactiveItems”部分的示例
“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。另外,请注意,一个事务将消耗两倍于常规写入的容量 你能解决这个问题吗?嘿,答案对你有用吗?如果有,您应该接受它,以便其他用户知道它解决了问题。如果你不得不做一些调整,或者使用了不同的解决方案,请留下评论或添加自己的答案,与他人分享这些知识。