Amazon dynamodb 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
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年底增加了事务支持。如果您想将测试限制在本地环境中,也许值得一看。