Amazon dynamodb DynamoDB PutItem要求GSI分区密钥已存在

Amazon dynamodb DynamoDB PutItem要求GSI分区密钥已存在,amazon-dynamodb,Amazon Dynamodb,仅当新项的GSI分区键已存在于另一项上时,我希望PutItem成功 假设我的表有以下项目(省略一些属性): 我试图把这个项目: { PK: 3, GSI1PK: "e", GSI1SK: "f" } 我希望此PutItem请求失败,因为该表尚未包含GSI1PK==“e”的项 如果可能的话,我想用一个条件表达式来解决这个问题。我不想通过在PutItem请求之前查询表来解决这个问题 以下是我如何尝试通过一个我希望成功的示例(go sdk)实现这一

仅当新项的GSI分区键已存在于另一项上时,我希望PutItem成功

假设我的表有以下项目(省略一些属性):

我试图把这个项目:

{
  PK: 3,
  GSI1PK: "e",
  GSI1SK: "f"
}
我希望此PutItem请求失败,因为该表尚未包含GSI1PK==“e”的项

如果可能的话,我想用一个条件表达式来解决这个问题。我不想通过在PutItem请求之前查询表来解决这个问题

以下是我如何尝试通过一个我希望成功的示例(go sdk)实现这一点:


但是异常被抛出:“ConditionalCheckFailedException:条件请求失败”。

我真的看不到这样做的方法,因为您要检查的值位于另一项上。因此,将这两个操作放置为ConditionCheck和PutItem。如果条件检查(检查其他项中的值是否存在)成功,并且PutItem成功,那么您就成功了。如果条件检查失败,PutItem也会失败。

在您希望失败的put请求示例中,您提到“……表中还没有包含GSI1PK==“d”的项,但该项有“GSI1PK:”e”“。这是对的吗?@PerttuHaliseva,那是个打字错误。我把它修好了。从我看来,这可能是不可能的。这里有一个相关的答案比我能更好地解释这个问题:目前我正在这样做,但没有交易。谢谢如果没有人提供在PutItem请求中执行的方法,您将接受您的回答。至少在事务中,您没有往返到DB。这是一次旅行。不支持在同一事务中执行
GetItem
PutItem
操作。不过,我相信这是正确的方向。您可以先执行
条件检查
,然后执行
放置
。抢手货不知道为什么我被困在getitem上。您是正确的,它是ConditionCheck,而不是GetItem。我更改了答案以正确回答。我可以用GSI进行
条件检查吗?我认为它需要主键。
{
  PK: 3,
  GSI1PK: "e",
  GSI1SK: "f"
}
input := &dynamodb.PutItemInput{
    Item: map[string]*dynamodb.AttributeValue{
        "PK":         intAttrVal(3),
        "GSI1PK":     stringAttrVal("a"),
        "GSI1SK":     stringAttrVal("f"),
    },
    ConditionExpression: stringRef("attribute_exists(GSI1PK)"),
    TableName:           &tableName,
}