假设我的数据结构有几个数据成员
class Data {
@DynamoDBHashKey
@DynamoDBAutoGeneratedKey
String id;
String id1;
String id2;
....
}
现在我想基于id1
和id2
进行查询,例如SQL where id1 ="id1" and id2 = "id2"
。我知道我应该把它们作为全局二级密钥,如下所示:
将id1和id2设为不同的索引,如下所示:
@DynamoDBIndexHashKey(globalSecondaryIndexName = "INDEX_ID1")
String id1;
@DynamoDBIndexHashKey(globalSecondaryIndexName = "INDEX_ID2")
String id2;
//And then do query it by any of the index name:
DynamoDBQueryExpression<Data> query = new DynamoDBQueryExpression<Data>()
.withIndexName("INDEX_ID1") //or INDEX_ID2 here
.withConsistentRead(false) //GSIs do not support consistent reads
.withKeyConditionExpression("id1 = :id1 AND id2 = :id2")
.withExpressionAttributeValues(ImmutableMap.of(":id1", new AttributeValue(id1), ":id2", new AttributeValue(id2)));
将id1和id2作为分区键,并在相同的索引名称下排序键:
@DynamoDBIndexHashKey(globalSecondaryIndexName = "INDEX_ID1_ID2")
String id1;
@DynamoDBIndexRangeKey(globalSecondaryIndexName = "INDEX_ID1_ID2")
String id2;
//And then do query it by the only index name:
DynamoDBQueryExpression<Data> query = new DynamoDBQueryExpression<Data>()
.withIndexName("INDEX_ID1_ID2")
.withConsistentRead(false) //GSIs do not support consistent reads
.withKeyConditionExpression("id1 = :id1 AND id2 = :id2")
.withExpressionAttributeValues(ImmutableMap.of(":id1", new AttributeValue(id1), ":id2", new AttributeValue(id2)));
哪种方式正确或更好?
此外,如果我想根据两个以上的条件进行查询(比如有一个id3),那我该怎么办呢?
答案 0 :(得分:0)
将id1和id2设为不同的索引,如此
在此,您无法在id1
和id2
上进行查询,只能在一个查询。这是因为DynamoDB不允许您同时使用两个不同的索引。
将id1和id2作为分区键并在相同索引名称下排序键
这适用于类似SQL的where id1 ="id1" and id2 = "id2"
查询。但是,如果添加另一个id
,该方法将无法扩展,因为您只能拥有一个分区键和一个排序键。
如上面的评论中所述,您可以Scan
获取更多过滤条件和条件。但是,如果您认为将来需要更多复杂性,DynamoDB可能不适合您。