gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:34:09 25 4
gpt4 key购买 nike

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

假设我的表中有 20 列,而全局二级索引中只提到了两列。我如何使用 GSI 并从主表加载数据来实现此目的。

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

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

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

当然,第二个选项是将更多基本属性(甚至全部属性)投影到索引表上。这会增加您的存储空间以及可能的读写成本,因此您是否要这样做取决于您的应用程序。在某些特定情况下,甚至可以有相同属性的两个索引,但具有不同数量的投影属性。

关于java - 根据 GSI 索引和范围键从 Dynamo 数据库获取所有列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56945717/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com