【问题标题】:DynamoDB PutItem creating multiple items with same partition key when it should be replacing the itemDynamoDB PutItem 在应该替换项目时创建具有相同分区键的多个项目
【发布时间】: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


【解决方案1】:

在与 AWS Support 取得联系后,发现这是在本地使用 DynamoDB 的一个已知问题。他们提供了以下修复指南:

正如您提到的,您正在使用 docker 映像进行部署 DynamoDB 本地 [1],请继续删除 步骤 2 中给出的“-optimizeDbBeforeStartup”标志(“Docker 选项卡”)(以及 然后将其保存为 docker-compose.yml):

  1. 从参数列表中删除“-optimizeDbBeforeStartup”: ========== .. .. 命令:“-jar DynamoDBLocal.jar -sharedDb -dbPath ./data” .. .. ==========

  2. 创建表格并插入项目

  3. docker-compose down

  4. 码头工人组成

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    • 2014-03-24
    • 2019-10-06
    • 2021-10-04
    相关资源
    最近更新 更多