当前位置: 首页 > 知识库问答 >
问题:

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

都博裕
2023-03-14

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

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

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,
}

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

共有1个答案

翁宜年
2023-03-14

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

 类似资料:
  • 切换到一台新电脑后,我不得不再次安装SmartGIT for Windows,现在尝试克隆我的fedorahosted。组织存储库。密钥存储在C:/User/myusername/中。ssh,SmartGIT提供了一个干净的安装,克隆我的存储库的URL是正确的-不幸的是,SmartGIT没有要求密钥,它只是尝试连接到fedorahosted。但是当然失败了。 所以这里可能出了什么问题?我必须把ss

  • 我试图在我的一个项目中使用Google Maps API,并在指导中设置API凭据,它希望我将应用程序的SHA-1签名证书指纹添加到API中。 在说明中,它说使用下面的命令来获取指纹: 当我尝试使用它时,无论是在Android Studio终端还是在我的应用程序目录中的cmd提示符,我都得到以下错误: 注意,我的应用程序在D:\Projects\Android\AppName中。 我如何获得我的S

  • 我正在尝试将以下结构存储在卡桑德拉中。 上面的大多数查询是 这就是为什么将()设置为主键很有用的原因。 根据docu,Cassandra的默认分区键是主键的第一列-在我的例子中是,但我想在Cassandr集群上均匀分布数据,我不能允许一个中的所有数据只存储在一个分区中,因为有些商店有10M条记录,有些只有1k条记录。 我可以设置()作为分区键,然后我可以达到Cassandra集群中记录的统一分布。

  • 我用passport进行身份验证。js。然而,在创建会话之后,在每次AJAX请求之后,RoboForm都会请求保存密码。不知道是什么原因。 接受:/ 接受-编码:gzip,放气,sdch,br 接受-语言:en-US,en;q=0.8 连接:保持活力 Cookie:connect.sid=s:jvQRBQY... 主机:localhost:3000 如果-无-匹配:W/"140-360389655

  • pip识别全局安装的软件包-( 我用VirtualVWrapper预激活钩子清理蟒蛇, 然后echo$PYTHONPATH返回空字符串,但这没有帮助。 发生了什么?