DynamoDBMapper:查询多个条件

时间:2017-02-14 19:25:33

标签: amazon-web-services amazon-dynamodb nosql

假设我的数据结构有几个数据成员

class Data {
    @DynamoDBHashKey
    @DynamoDBAutoGeneratedKey
    String id;

    String id1;

    String id2; 

    ....
}

现在我想基于id1id2进行查询,例如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),那我该怎么办呢?

1 个答案:

答案 0 :(得分:0)

  1.   

    将id1和id2设为不同的索引,如此

  2. 在此,您无法在id1id2上进行查询,只能在一个查询。这是因为DynamoDB不允许您同时使用两个不同的索引。

    1.   

      将id1和id2作为分区键并在相同索引名称下排序键

    2. 这适用于类似SQL的where id1 ="id1" and id2 = "id2"查询。但是,如果添加另一个id,该方法将无法扩展,因为您只能拥有一个分区键和一个排序键。

      如上面的评论中所述,您可以Scan获取更多过滤条件和条件。但是,如果您认为将来需要更多复杂性,DynamoDB可能不适合您。