gpt4 book ai didi

amazon-dynamodb - DynamoDBSaveExpression 对 GSI 进行条件检查

转载 作者:行者123 更新时间:2023-12-03 16:51:43 25 4
gpt4 key购买 nike

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

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

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

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

谢谢!

最佳答案

即使使用新宣布的事务,您描述的方法也无法使用 DynamoDB。原因是因为您的 GSI 最终是一致的,并且可能无法反射(reflect)表中项目的最新状态,因此不能在 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-InUse每次添加或删除员工时,以及更新与给定 SSN 关联的员工 ID 时都使用表。另外,请注意事务消耗的容量是常规写入的两倍。

关于amazon-dynamodb - DynamoDBSaveExpression 对 GSI 进行条件检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53093787/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com