当前位置: 首页 > 知识库问答 >
问题:

如何使用DynamoDBMapper查询只有Hashkey的GSI的Dynamo DB

季华茂
2023-03-14

我对Dynamo DB非常陌生,可能这是一个非常琐碎的问题,但我浏览了Dynamo DB和堆栈溢出问题的文档,但我找不到一个链接来告诉如何为GSI查询DDB,GSI只有哈希键,没有指定范围键。

我得到异常非法查询表达式:在查询中没有找到哈希键条件。

共有1个答案

施学
2023-03-14

在您的DynamoDB注释模型对象上,您应该使用@DynamodBindexHashKey(globalSecondaryIndexName=“GSIIndexName)表示它是GSI的哈希键:

@DynamoDBTable(tableName = "myTable")
public class MyTable {
    ...

    @DynamoDBIndexHashKey(globalSecondaryIndexName = "myGsi")
    public String getGsiHk() {
        return gsiHk;
    }

    ...
}

然后在DynamodbMapper上使用Query方法:

final MyTable gsiKeyObj = new MyTable();
gsiKeyObj.setGsiHk("myGsiHkValue");
final DynamoDBQueryExpression<MyTable> queryExpression = 
    new DynamoDBQueryExpression<>();
queryExpression.setHashKeyValues(gsiKeyObj);
queryExpression.setIndexName("myGsi");
queryExpression.setConsistentRead(false);   // cannot use consistent read on GSI
final PaginatedQueryList<MyTable> results = 
    mapper.query(MyTable.class, queryExpression);
 类似资料:
  • 我有一个具有两个属性的dynamoDB表: A: 主分区键 B: 主排序键 我想使用属性B查询这个表,因为我不知道A的值。可以这样做吗? 是否可以将B设为GSI(全局二级索引),如何使用B查询表,因为B已经是排序键。

  • 实际上,我正在使用DynamoDBmapper查询我的dynamo表。为此,我创建了两个类,映射程序使用它们转换表返回的查询。见下文 ame.java java 然后我在HashKey上查询我的表,如下所示 对于GSI,我会这样做 一切都很好,但是对于名为typos的字段,我得到了两个查询之间的差异。对于customer_id,我获得如下完整元素 但对于同一个用户,但使用他的GSI,我得到如下结果

  • 假设我有一个DynamoDB表: UserId是主键(hash),我需要将BookName设置为排序键(range),因为添加到数据库中的另一项用相同的UserId覆盖了前面的项。

  • 我有一个名为“弗兰克”的DynamoDB表,只有一个GSI。分区键称为PK,排序键称为SK,GSI分区键称为GSI1_PKGSI排序键称为GSI1_SK。我有一个存储实际数据的“数据”映射。 GSI分区键和排序键直接映射到表中具有相同名称的属性。 我可以运行partiql查询来获取图像中显示的结果。以下是PartIQ代码: 注意分区代码是如何多次引用“GSI1_SK”的。分区查询有效,并返回图像中

  • 我有一个表,其中有一个二级索引。我的二级索引使用DynamoDB编组。 如何查询此GSI上的表?addRangeKeyCondition仅支持withS和withN方法。如何使用我的对象查询它?如果范围键是字符串,我会这样查询: 但我不能这样做,因为我的范围键使用封送拆收器。如何使用此范围键查询我的GSI?

  • 在我的DynamoDB表中,有HashKey=ID和GSI=Type。我需要获取特定类型(GSI)的所有hashKeys(ID)。 在这种情况下,获取给定类型的所有ID的有效方法是什么?我的DynamoDB表不会很大。