幕布斯7119047
2023-03-17 10:26:17
我只有兩個在 dynamo db GSI 索引級別定義的投影。但要創(chuàng)建預期的響應,我還需要從 dynamo db 獲取其他列。假設我的表中有 20 列,全局二級索引中只提到了兩列。我如何使用 GSI 和從主表加載數據來實現(xiàn)這一點。我是否需要用戶查詢請求或我想到的另一種方法是從索引中提取數據然后在主表上搜索。這是我現(xiàn)有的代碼: 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)}請?zhí)岢鰧崿F(xiàn)這一目標的最佳方法。
1 回答

慕姐4208626
TA貢獻1852條經驗 獲得超7個贊
如您所述,在 GSI 中,如果您選擇不將所有基表的列投影到索引表中,則在查詢索引時這些其他列不可用。這樣做的原因不是實施者懶惰,而是效率:在 GSI 中,索引表以與基表不同的方式分布在整個 DynamoDB 集群中,因此在讀取索引表數據時,沒有有效的方法也可以讀取同時從基表。順便說一下,這正是 LSI 與 GSI 的不同之處 - 在 LSI 中,索引和基表位于同一位置,并且可以一起讀取,因此 DynamoDB 確實為您提供了一種方法來請求未投影的列。
所以我認為你有兩個選擇。一種是BatchGetItem
在讀取完索引數據后,再請求讀取基表數據。請注意,當您查詢索引時,您始終可以取回基表鍵屬性,因此您可以使用這些屬性從基表中讀取完整的項目。BatchGetItem
可能是進行這些讀取的最有效方法,而不是使用GetItem
.
當然,第二個選項是將更多基本屬性(甚至全部)投影到索引表中。這會增加你的存儲和可能的讀寫成本,所以你是否要這樣做取決于你的應用程序。在某些特定情況下,具有相同屬性的兩個索引甚至具有不同數量的投影屬性也是有意義的。
添加回答
舉報
0/150
提交
取消