【问题标题】:Query in Dynamo DB without hashkey or scan在没有 hashkey 或扫描的 Dynamo DB 中查询
【发布时间】:2016-03-08 07:01:29
【问题描述】:

我希望在没有 HashKey 的情况下查询 Dynamo DB。我尝试过使用扫描,但它很昂贵,因此正在寻找其他替代方法。

【问题讨论】:

  • 请提供一些示例数据和您想要的输出。 (有关如何添加一些信息,请参阅 How to format SQL tables in a Stack Overflow post?。)其他架构信息以及您的尝试失败的地方也将帮助我们更好地帮助您。
  • 试过这样:filter.put("id", new Condition().withComparisonOperator(ComparisonOperator.EQ) .withAttributeValueList(new AttributeValue().withS(id))); scanExpression.setScanFilter(过滤器); //TableNamess为表名 list = dynamoDBMapper.scan(TableNamess.class, scanExpression, dynamoDBOperations.getTableNameOverride(tableName));
  • 请点击edit链接更新问题,该链接位于问题内容下方。 Question 提供了比 cmets 更多的格式化功能。

标签: amazon-dynamodb


【解决方案1】:

首先我应该说,在不知道哈希键的情况下查询 DynamoDB 表是不可能的。这是有道理的。

现在,您要使用的哈希键是否是表的主键,由您决定。

例如,假设您有下表:

╔══════════════════════╦════════════════════════╦════════════════╗
║ course_id (Hash Key) ║      course_name       ║    teacher     ║
╠══════════════════════╬════════════════════════╬════════════════╣
║ 324234               ║ Node.js for Dummies    ║ Ryan Dahl      ║
║ 213323               ║ How to train your cat  ║ Jackson Galaxy ║
║ 324090               ║ Cat Logic              ║ Jackson Galaxy ║
║ 763298               ║ Diving into .NET       ║ Eric Lippert   ║
╚══════════════════════╩════════════════════════╩════════════════╝

表的主键和散列键是course_id,没问题。提供唯一的哈希键允许您的表被拆分为多个分区。

但是,如果我们想获得 Jackson Galaxy 教授的所有课程,该怎么办?

我们不知道这些课程的course_id,这就是我们想要得到的。所以我们发现自己不知道项目的哈希键值。

这就是 GSI 发挥作用的地方。 全局二级索引让您可以为您的表定义不同的哈希键。 请注意,它不会更改主哈希键 - course_id 仍将是表的哈希键。

GSI 仅提供了一个额外的哈希键,以便您能够进行更复杂的查询。

假设我们添加了一个名为 teacher_index 的 GSI,我们说 teacher 将是我们的哈希键,course_id 将是我们的范围键(我们需要指定一个范围键,因为 teacher 单独作为哈希键会产生重复的条目)。

现在我们可以查询我们的teacher_index 并传入Jackson Galaxy 作为哈希键值。结果将是 213323 - How to train your cat324090 - Cat Logic

【讨论】:

  • 感谢您提供非常简单直接的答案。
  • 好答案。但这不是突出了 dynamodb 的局限性吗?在 mongodb 中,无需为要查询的内容指定显式索引。我只是想了解这里的区别。
  • 很好的答案,帮助我理解 GSI 概念,但假设我想为教师创建一个搜索功能,如果教师是 hash_key,我如何使用 contains
【解决方案2】:

我部分同意 Matias 发布的答案。您可以在表上创建全局二级索引(使用哈希键和可选范围键)。

但是,我不同意他稍后在回答中所说的话:“我们需要指定一个范围键,因为单独作为哈希键的教师会产生重复的条目”。我无法在他的回答下方发表评论,因为我没有足够的声誉。由于某种原因,我无法编辑他的答案。

来自 AWS docs

全局二级索引不强制唯一性

因此,全球二级索引 (GSI) 的范围键是可选的,GSI 的复合键不需要唯一标识任何记录。

【讨论】:

    猜你喜欢
    • 2018-05-24
    • 2017-04-10
    • 1970-01-01
    • 2018-02-05
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    • 1970-01-01
    相关资源
    最近更新 更多