【发布时间】:2021-06-22 21:16:42
【问题描述】:
我在本地使用带有 NoSQL Workbench 和 Express API 的 DynamoDB。
我有一个这样生成的表:
const params = {
AttributeDefinitions: [
{
AttributeName: 'id',
AttributeType: 'S',
},
],
KeySchema: [
{
AttributeName: 'id',
KeyType: 'HASH',
}
]
TableName: table.name,
ProvisionedThroughput: {
ReadCapacityUnits: 1,
WriteCapacityUnits: 1
},
}
dynamo.createTable(params).promise() // ... simplified version
我像这样使用 DocumentClient 更新一个项目:
const db = new AWS.DynamoDB.DocumentClient(configOptions);
const data = await db.put({
TableName,
Item,
}) // ... interact with result
有时,它会在 DynamoDB 中创建一个具有完全相同的 id 值的新项目,即使我将其创建为 HASH 并将其设为分区键。
但是,它不会发生每次。我似乎无法始终如一地重新创建它。
我创建此表或更新此项目的方式是否有问题导致此问题?
在此处查看项目 97/98,此图像是我的 NoSQL Workbench,您可以看到有两个项目具有相同的 id
【问题讨论】:
-
我不确定我是否理解这个问题。您期望的行为是什么,正在发生什么?我认为您误解了哈希键,但在提供解释之前我需要确保我理解了问题。
-
根据定义,这是不可能的。您是否在实际表上定义了排序键?这意味着主键是 HASH+SORT 并且允许重复的 HASH 键值..
-
请注意,PutItem 将替换具有相同主键的旧项目。默认情况下,它不会产生主键/唯一键违规(尽管您可以使用有条件的 PutItem 来实现这一点)。
-
@JasonWadsworth 预期的行为是 PutItem 替换现有项目并使用
id属性来知道要替换哪个项目。由此产生的行为是,似乎随机创建了一个使用相同 ID 而不是替换它的附加项目。然后,这会导致在与这些项目交互的 DB 上采取的后续操作中出现错误,因为它们不是唯一的。我将在 OP 中添加屏幕截图。 -
@Charles 这也是我的想法,但它正在发生。这让我想知道我是否没有正确创建表格以使这些项目独一无二。或者如果我错误地使用了 PutItem?
标签: amazon-web-services amazon-dynamodb dynamo-local