Amazon dynamodb DynamoDB条件表达式是否可以仅对具有复合键的表的分区键工作

Amazon dynamodb DynamoDB条件表达式是否可以仅对具有复合键的表的分区键工作,amazon-dynamodb,Amazon Dynamodb,我有一个DynamoDB表,带有一个复合键,如下所示: ddbClient.put({ TableName: "YOUR TABLE", Item: { PK: "USER#B", SK: "BUG#2", Type "Bug", Description: "My user wasn't created first!" }, ConditionExp

我有一个DynamoDB表,带有一个复合键,如下所示:

ddbClient.put({
  TableName: "YOUR TABLE",
  Item: {
    PK: "USER#B",
    SK: "BUG#2",
    Type "Bug",
    Description: "My user wasn't created first!"
  },
  ConditionExpression: "attribute_exists(PK)"
})
主键 SK 类型 电子邮件 描述 用户#A 用户#A 使用者 a@example.com 用户#A 错误1 缺陷 这个看起来不错 用户#B 错误2 缺陷 我的用户不是第一个创建的!
DynamoDB条件表达式可能会令人困惑,文档可能会加剧这个问题

DynamoDB条件表达式的工作原理是:1)查找项,2)计算条件表达式,最后3)如果条件计算结果为true,则写入数据库

我假设您的
put
操作如下所示:

ddbClient.put({
  TableName: "YOUR TABLE",
  Item: {
    PK: "USER#B",
    SK: "BUG#2",
    Type "Bug",
    Description: "My user wasn't created first!"
  },
  ConditionExpression: "attribute_exists(PK)"
})
在本例中,DynamoDB首先尝试查找PK为:“USER#B”SK为:“BUG#2”的项目,该项目不存在。正如您所经历的,此项不会写入DynamoDB,因为不存在具有该主键的项

正如您在问题中提到的,您看到的问题是,
conditionexpression
仅适用于单个项目。但是,您正试图通过将条件应用于另一个项目,有条件地
将一个项目放入数据库中。这是一个很好的发电机候选人

事务允许您在“全部”或“无”操作中将操作分组在一起。如果事务中的一个操作失败,则整个事务将失败,并且所有操作都不会应用

通过这种方法,你可以实现你所追求的目标

ddbClient.transactWriteItems({
    TransactItems=[
    { "PUT":
        {
          TableName: "YOUR TABLE",
          Item: {
            PK: "USER#B",
            SK: "BUG#2",
            Type "Bug"
          }
        }
    },
    { "ConditionCheck":
        {
          TableName: "YOUR TABLE",
          Item: {
            PK: "USER#B",
            SK: "USER#B"
          },
          ConditionExpression: "attribute_exists(PK)"
        }
    }
  ]

})
在上面的事务中,在输入bug之前,我将使用a来确认用户的存在。如果用户不存在,事务将失败,错误将不会写入DDB


要更全面地解释DynamoDB条件表达式,我强烈建议您查看Alex Debrie的文章。

谢谢Seth。我在等你回答的时候发现了亚历克斯的文章。我也尝试了事务,但是本地数据库实现不支持它们(我希望能够脱机测试/调试),这太糟糕了,因为:您的本地设置不支持事务。我不确定您使用的是什么,但我知道DynamoDB local在2019年底增加了事务支持。如果您想将测试限制在本地环境中,也许值得一看。