【问题标题】:DynamoDB PutItem require GSI partition key to already existDynamoDB PutItem 要求 GSI 分区键已经存在
【发布时间】:2021-02-04 11:03:06
【问题描述】:

我希望 PutItem 只有在新项目的 GSI 分区键已存在于另一个项目上时才能成功。

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

PK       GSI1PK    GSI1SK
1        a         b
2        c         d

我正在尝试放置这个项目:

{
  PK: 3,
  GSI1PK: "e",
  GSI1SK: "f"
}

我希望这个 PutItem 请求失败,因为该表还没有包含 GSI1PK == "e" 的项目。

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

这是我通过一个我想成功的示例(go sdk)尝试此操作的方法:

input := &dynamodb.PutItemInput{
    Item: map[string]*dynamodb.AttributeValue{
        "PK":         intAttrVal(3),
        "GSI1PK":     stringAttrVal("a"),
        "GSI1SK":     stringAttrVal("f"),
    },
    ConditionExpression: stringRef("attribute_exists(GSI1PK)"),
    TableName:           &tableName,
}

但是抛出异常:“ConditionalCheckFailedException: The conditional request failed”。

【问题讨论】:

  • 在您希望失败的 put 请求示例中,您提到“...该表尚未包含 GSI1PK == “d”的项目,但该项目具有“GSI1PK:”e ""。这样对吗?
  • @PerttuHaliseva 这是一个错字。我修好了。
  • 据我所知,这可能是不可能的。这是一个相关的答案,它比我更好地解释了这个问题:stackoverflow.com/questions/32833351/…

标签: amazon-dynamodb


【解决方案1】:

我真的没有办法做到这一点,因为您要检查的值在另一个项目上。因此,将 ConditionCheck 和 PutItem 这两个操作放在DynamoDB transaction 中。如果条件检查,即检查其他项目中的值是否存在,并且 PutItem 成功,那么你很好。如果条件检查失败,PutItem 也会失败。

【讨论】:

  • 现在我正在这样做,但没有交易。谢谢。如果没有人根据 PutItem 请求提供方法,将接受您的回答。
  • 至少在事务中,您不会往返于数据库。这一切都在一次旅行中。
  • 不支持在同一事务中执行GetItemPutItem 操作。不过,我相信这是正确的方向。您可以使用ConditionCheck,然后是Putdocs.aws.amazon.com/amazondynamodb/latest/developerguide/…
  • 好收获。不知道为什么我被困在 getitem 上。你是对的,它是 ConditionCheck,而不是 GetItem。我更改了答案以正确地说出来。
  • 我可以用 GSI 做一个ConditionCheck 吗?我认为它需要主键。
猜你喜欢
  • 1970-01-01
  • 2020-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多