【问题标题】:In DynamoDb, is there a way to atomically check a secondary index for an item before writing it?在 DynamoDb 中,有没有办法在编写项目之前自动检查项目的二级索引?
【发布时间】:2021-02-02 01:28:22
【问题描述】:
我有一个这样的对象:
{
"id": (UUID generated at call time)
"referenceId": (Foreign key for another system)
"referenceType": (enum)
}
主索引只是
我有一个二级索引,比如
- 主键:referenceId
- 辅助键:referenceType
所以我想做的就是用referenceId和referenceType查询secondary索引,如果是空的,就把记录写到表中。
问题是,条件表达式只能检查您正在查询的同一索引。我研究了 DynamoDb 事务,但他们说你不能让两个事务针对同一个项目。
有没有办法让它工作?
【问题讨论】:
标签:
amazon-dynamodb
primary-key
secondary-indexes
【解决方案1】:
如果我正确理解您的问题,您的商品具有三个属性:id,
referenceId 和 referenceType。您还定义了一个具有复合主键referenceId 和referenceType 的全局二级索引。
假设所有这些属性都是同一个项目的一部分,您应该不需要在决定写入表之前阅读二级索引。相反,您可以在该项目上尚不存在referenceId 和reference type 的条件下执行PUT 操作。
ddbClient.putItem({
"TableName": "YOUR TABLE NAME",
"Item": { "PK": "id" },
"ConditionExpression": "attribute_exists(referenceId) AND attribute_exists(referenceType)"
})
您可能还想在DynamoDB condition expressions 上查看这篇精彩的文章。
【解决方案2】:
据我了解,您的表 PK 是“在调用时”生成的,因此对于具有相同参考 ID 和参考类型的两个不同请求,它会有所不同。
既然如此,你的答案是否定的。
如果您需要由外部系统设置的键的唯一性,您应该考虑为您的 DDB 表使用相同的键或它的一些混搭。
或者,修改外部系统以设置给定参考 ID 和类型的 UUID。