Amazon dynamodb 在Dynamo DB中查询,不使用哈希键或扫描

Amazon dynamodb 在Dynamo DB中查询,不使用哈希键或扫描,amazon-dynamodb,Amazon Dynamodb,我想查询没有HashKey的Dynamo数据库。我尝试过使用scan,但它很昂贵,因此需要寻找其他替代方法。我应该首先说,在不知道哈希键的情况下查询DynamoDB表是不可能的。这是有道理的 现在,要使用的散列键是否为表的主键取决于您 例如,假设您有下表: ╔══════════════════════╦════════════════════════╦════════════════╗ ║ course_id (Hash Key) ║ course_name ║ t

我想查询没有HashKey的Dynamo数据库。我尝试过使用scan,但它很昂贵,因此需要寻找其他替代方法。

我应该首先说,在不知道哈希键的情况下查询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\u id
,这很好。提供唯一的哈希键可以将表拆分为多个分区

但是,如果我们想获得杰克逊银河所教授的所有课程,该怎么办

我们不知道这些课程的
课程id
,这就是我们想要的。因此,我们发现自己不知道项的散列键值

这就是GSI发挥作用的地方全局二级索引用于为表定义不同的哈希键请注意,它不会更改主哈希键-
课程id
仍然是表的哈希键。

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

假设我们添加了一个名为
teacher\u index
的GSI,我们说
teacher
将是我们的散列键,
course\u id
将是我们的范围键(我们需要指定一个范围键,因为
teacher
单独作为散列键将生成重复的条目)


现在我们可以查询我们的
teacher\u索引
,并将
Jackson Galaxy
作为散列键值传入。结果将是
213323-如何训练你的猫
324090-猫的逻辑
我部分同意Matias给出的答案。您可以在表上创建全局二级索引(使用哈希键和可选的范围键)

然而,我不同意他在稍后的回答中所说的:“我们需要指定一个范围键,因为教师单独作为散列键将生成重复的条目”。我不能在他的回答下面发表评论,因为我没有足够的声誉。由于某种原因,我无法编辑他的答案

来自AWS:

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


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

请提供一些示例数据和所需的输出。(请参阅以了解如何添加一些。)其他架构信息以及尝试失败的位置也将帮助我们更好地帮助您。尝试如下:filter.put(“id”,new Condition()。withComparisonOperator(ComparisonOperator.EQ)。withAttributeValueList(新AttributeValue().with(id));scanExpression.setScanFilter(filter);//TableNames是表名列表=dynamoDBMapper.scan(TableNames.class,scanExpression,dynamodboOperations.getTableNameOverride(tableName));请单击问题内容下方的链接来更新问题。问题允许许多格式功能,而不是注释。感谢您提供了一个非常简单明了的答案。回答得好。但这不是突出了dynamodb的一个限制吗?在mongodb中,不需要为您需要的内容指定显式索引ant进行查询。我只是想了解这里的差异。回答得很好,帮助我理解GSI的概念,但是假设我想为教师创建一个搜索函数,如果教师是散列键,我如何使用用户
包含