根据 GSI 索引和范围键从 Dynamo 数据库中获取所有列

Fetch all Columns from Dynamo db based on GSI index and range key

我只在 dynamo db GSI 索引级别定义了两个投影。但要创建预期的响应,我还需要从 dynamo db 获取其他列。

假设我的 table 中有 20 列,而在全局二级 index.How 中只提到了两列,我可以使用 GSI 并从主 table 加载数据来实现吗?

我是否需要用户查询请求或我想到的另一种方法是从索引中提取数据,然后在主 table 上搜索。 这是我现有的代码:

    public List<DynamoDBObject> getData(String gsiHashKey) {


        DynamoDBObject dynamoDBObject= new DynamoDBObject();

        command.setgsiHashKey(gsiHashKey);

     final DynamoDBQueryExpression<DynamoDBObject> queryExpression = 
new DynamoDBQueryExpression<>();

  queryExpression.setIndexName("gsi_index_name");

      queryExpression.setHashKeyValues(dynamoDBObject);
return mapper.query(DynamoDBObject.class,queryExpression)
}

请提出实现此目的的最佳方法。

如您所述,在 GSI 中,如果您选择不将所有基础 table 的列投影到索引 table,则这些其他列在查询索引时不可用。这样做的原因不是实现者的懒惰,而是效率:在 GSI 中,索引 table 以不同于基础 table 的方式分布在整个 DynamoDB 集群中,因此在读取索引 table 数据没有 高效 方法同时从基数 table 读取。顺便说一句,这正是 LSI 与 GSI 的不同之处 - 在 LSI 中,索引和基数 table 是 co-located,并且可以一起读取,因此 DynamoDB 确实为您提供了一种方法来请求未投影的列.

所以我认为你有两个选择。一种是读取索引数据后,使用BatchGetItem请求读取base-table数据。请注意,当您查询索引时,您始终可以取回 base-table 键属性,因此您可以使用这些属性从基 table 中读取完整的项目。 BatchGetItem 可能是进行这些读取的最有效方法,而不是使用 GetItem.

一项一项地检索项目

第二个选项当然是将更多基本属性(甚至所有)投影到索引 table 上。这会增加你的存储和可能的读写成本,所以你是否要这样做取决于你的应用程序。在某些特定情况下,具有相同属性的两个索引甚至具有不同数量的投影属性也是有意义的。