【发布时间】: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