【问题标题】:How can I Use begins_with method on primary key in DynamoDB?如何在 DynamoDB 的主键上使用 begin_with 方法?
【发布时间】:2017-01-28 04:48:26
【问题描述】:

我有 2 个属性 id(字符串,主键),值(字符串)的表。 当我尝试遵循 KeyConditionExpression 时,它会抛出 Query key condition not supported。

KeyConditionExpression: "begins_with(ID, :tagIDValue)" 
                        or
KeyConditionExpression: "contains(ID, :tagIDValue)"

从this 链接我了解到我们只能在主键上使用 EQ 操作。我怎样才能做到这一点

解决办法:=========================================== ============

我需要使用 begin_with 或 contains 来过滤所以我采用了以下方法。

表格属性:PK(partion_key, string), ID(sort key, string), value(string)。

现在我的主键是基于 PK,ID 框架的

PK 将具有所有行的恒定值。所以 KeyConditionExpression 会像。

KeyConditionExpression: "PL = :pk  and begins_with(ID, :tagIDValue)"

注意:但仍然包含不能使用 KeyConditionExpression。我认为它已从 KeyConditionExpression 中删除

【问题讨论】:

  • 您自己的“解决方案”向我展示了“PL = :pk and begin_with(ID, :tagIDValue)”的正确语法。谢谢你。这在 AWS 文档中不是很清楚。

标签: amazon-web-services amazon-dynamodb


【解决方案1】:

您不能在哈希(主)键上使用begins_with 条件表达式。它仅适用于 scan 方法和 Range(sort) 键。

您可以做的另一件事是创建一个GlobalSecondaryIndexes,并将 ID 作为哈希键。

例如:

  IntentTable:
     Type: AWS::DynamoDB::Table
     Properties:
       BillingMode: PAY_PER_REQUEST
       KeySchema:
         - AttributeName: id
           KeyType: HASH
         - AttributeName: timestamp
           KeyType: RANGE
       AttributeDefinitions:
         - AttributeName: client
           AttributeType: S
         - AttributeName: timestamp
       GlobalSecondaryIndexes:
         - IndexName: byID
           KeySchema:
             - AttributeName: ID
               KeyType: HASH
             - AttributeName: timestamp
               KeyType: RANGE
           Projection:
             ProjectionType: ALL

然后现在您可以使用query 使用该索引而不是scan. 不惜一切代价避免扫描,否则您会对每月的账单感到震惊。

【讨论】:

    【解决方案2】:

    我会不惜一切代价远离扫描,在这种情况下我会创建一个全局二级索引。 GSI 上的主键不需要唯一性,您可以从中查询。存储很便宜,你可能可以忍受额外的钥匙。

    【讨论】:

    • 使用 GSI,您仍然需要在排序键上使用 begins_with,不是吗?
    • @MitchellTyson,是否需要确保 GSI 中的数据量不超过 10GB,因为这是分区的最大大小?
    【解决方案3】:

    我不同意 Tolbahady 关于 begins_with 和 contains 只能在范围键中使用的声明。您可以使用方法scan 在任何键中使用任何比较运算符。 Scan 是一种灵活但昂贵且低效的执行 dynamodb 查询的方法。

    无论如何,有一个名为AWS NoSQL Workbench 的工具。它有点像 MySQL Workbench。它的好处是,您可以在检查访问模式(您的应用程序针对您的表的可能和最常用的查询)的同时构造您的表。

    【讨论】:

      【解决方案4】:

      在为主键指定 EQ 条件后,您只能将 begins_with 和 contains 与范围键一起使用。

      要使用带有主键的 EQ,您可以这样做

      KeyConditionExpression: "ID = :tagIDValue"
      

      【讨论】:

      • 感谢您的建议,我已经用分区键和范围键或排序键创建了主键
      • @Praveenkumar 请注意范围键和排序键是相同的。只是范围键是 AWS 的旧术语。现在他们使用术语排序键。
      • 使用 Query,您可以执行 >=、
      猜你喜欢
      • 1970-01-01
      • 2023-03-30
      • 2022-10-14
      • 1970-01-01
      • 2020-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多