【问题标题】:How to create dynamo db item without specifying gsi key如何在不指定 gsi 键的情况下创建 dynamo db 项目
【发布时间】:2020-08-13 17:58:43
【问题描述】:

我正在使用一个使用 gsi 的 dynamo db 表,因此我可以通过附加属性进行查询(如果存在)。此属性将在流程中更新,因此所有项目在流程开始时都没有此属性。此属性在添加到项目时设置为 gsi 的主键。

除了指定 gsi 的主键我无法插入新项目之外,一切都按预期工作。如果尚未设置其主键,我希望 gsi 忽略该项目。在指定投影属性时,我认为使用 INCLUDE 选项可以做到这一点。显然我在这里弄错了,但我也不知道如何解决这个问题。

非常感谢任何帮助,而且我将不得不坚持使用 dynamo db,所以包括这个 db 在内的每个提示都会有很大帮助!

编辑: 为了澄清 - 这些是我的属性:

  • id(主键:必填)
  • 名称(属性)
  • 年份(属性)
  • gsi_id(GSI 主键:可选)

我想添加一个带有字段的项目:

  • id(主键:必填)
  • 名称(属性)
  • 年份(属性)

然后添加 gsi_id 字段。

【问题讨论】:

  • Dynamodb 绝对允许您插入项目。无需指定 GSI 密钥。您所描述的模式称为稀疏索引,其中只有具有 GSI 键的项目才会投影到索引中。您是否遇到某种错误?

标签: amazon-dynamodb amazon-dynamodb-index amazon-dynamodb-data-modeling


【解决方案1】:

你的问题的前提是

如果不指定 GSI 的主键,我将无法插入新项目。

但是,我认为这个前提是不正确的。根据我的经验和文档,您可以在基本表中插入没有 GSI 键属性的项目,并且该项目将被添加到基表中但在index - 正是你想要发生的事情。

这里是一个来自the documentation的例如sn-p:

全局二级索引仅跟踪其关键属性实际存在的数据项。例如,假设您向 GameScores 表添加了另一个新项目,但只提供了所需的主键属性。 ... 因为您没有指定 TopScore 属性,DynamoDB 不会将此项目传播到 GameTitleIndex。

请注意,这仅适用于 缺少 属性。您真正不允许做的事情是在 GSI 密钥属性中使用错误的 type 设置值。例如,如果 GSI 密钥属性被定义为“数字”类型,则您无法在该属性中设置字符串 - 您将在更新操作中收到 ValidationException 错误。但是完全没有属性也没关系。

【讨论】:

  • 感谢您的回答!我刚刚使用 python sdk 和 boto3 检查了它。它工作正常。但是,当我在 Web UI 上使用 aws 控制台时,问题仍然存在。
猜你喜欢
  • 1970-01-01
  • 2010-12-02
  • 1970-01-01
  • 2015-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-09
相关资源
最近更新 更多