让我们说我的表中有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)
}
请提出实现此目标的最佳方法。
答案 0 :(得分:1)
如前所述,在GSI中,如果您选择不将所有基本表的列都投影到索引表上,那么在查询索引时这些其他列将不可用。这样做的原因不是实现者的懒惰,而是效率:在GSI中,索引表以与基本表不同的方式分布在整个DynamoDB集群中,因此在读取索引表数据时没有效率< / strong>的方式也可以同时从基表中读取。顺便说一下,这正是LSI与GSI不同的地方-在LSI中,索引表和基表位于同一位置,并且可以一起读取,因此DynamoDB确实为您提供了一种请求未投影列的方法。
所以我认为您还有两个选择。一种是在读取索引数据之后,使用BatchGetItem
请求读取基表数据。请注意,当您对索引进行查询时,始终可以获取基本表键属性,因此可以使用这些属性从基本表中读取完整的项。 BatchGetItem
可能是进行这些读取的最有效方法,而不是使用GetItem
一项一项地检索项目。
第二个选项当然是将更多基本属性(甚至所有这些属性)投影到索引表上。这将增加存储空间,并可能增加读写成本,因此是否要这样做取决于您的应用程序。在某些特定情况下,具有相同属性的两个索引以及不同数量的投影属性甚至是有意义的。