Amazon dynamodb GSI上带条件检查的DynamoDBSaveExpression

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时是不可能的

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

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

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

支持吗?我在文件中没有看到这一点


谢谢

您描述的方法在使用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。另外,请注意,一个事务将消耗两倍于常规写入的容量

你能解决这个问题吗?嘿,答案对你有用吗?如果有,您应该接受它,以便其他用户知道它解决了问题。如果你不得不做一些调整,或者使用了不同的解决方案,请留下评论或添加自己的答案,与他人分享这些知识。