java - 如何使用LSI和mapper查询dynamodb

标签 java amazon-dynamodb aws-sdk

我目前正在尝试使用 LSI 和 dynamoDB 映射器类从 dynamo DB 表加载信息。假设我有以下代码

考虑这个类

class Employee {
    @DynamoDBHashKey
    public String getID() {
        return ID;
    }
    @DynamoDBRangeKey
    public String getFirstName() {
        return firstName;
    }

    @DynamoDBIndexRangeKey(localSecondaryIndexName = "my-lsi")
    public String getLastName() {
    return lastName;
    }

    public String getMyotherfield() {
    return myotherfield;
    }
}

考虑这段代码以使用 LSI 和 dynamoDB 映射器检索信息

Employee obj = new Employee();
obj.setID("221");
obj.setLastName("SOMEONE");
DynamoDBQueryExpression<Employee> queryExpression = new DynamoDBQueryExpression<>();
queryExpression.setHashKeyValues(obj);
queryExpression.setIndexName("my-lsi");
queryExpression.setProjectionExpression("myotherfield");

PaginatedQueryList<Employee> paginatedQueryList = mapper.query(Employee.class, queryExpression);
Iterator<Employee> iterator = paginatedQueryList.iterator();
while (iterator.hasNext()) {
    Employee pp = iterator.next();
    // some code
}

[编辑] 这是使用映射器查询LSI的正确方法吗? 如果不是,使用 LSI 和 dynamoDBMapper 从表中获取数据的更好方法是什么? (就性能而言)

我还发现了这个https://java.awsblog.com/post/Tx3GYZEVGO924K4/The-DynamoDBMapper-Local-Secondary-Indexes-and-You但它是 2013 年的链接。我无法找到有关使用 LSI 和映射器查询的最新文档。

最佳答案

请注意,在您给出的代码中,您根本没有设置范围键。使用queryExpression.setRangeKeyConditions()这样做。

这是一个代码示例:

Map<String, Condition> rangeKeyConditions = new HashMap<>();
rangeKeyConditions.put("lastName", new Condition()
                 .withComparisonOperator(ComparisonOperator.EQ)
                .withAttributeValueList(new AttributeValue().withS("SOMEONE")));
queryExpression.setRangeKeyConditions(rangeKeyConditions);`

[更新]:

在对象(obj)中设置范围键值(“SOMEONE”)是不够的(也没有必要),因为该对象仅用于设置 hashKey。看看例子 here

关于java - 如何使用LSI和mapper查询dynamodb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39113233/

相关文章:

java - 这种锁定技术的名称是什么?

java - 尝试在页面上定位文本元素

java - 使用对象模型作为参数启动 java 程序

amazon-web-services - 需要定期更新时使用 Dynamo 表的最佳实践

python - Amazon DynamoDB -- 区域特定连接

go - 使用通配符匹配删除 s3 中的对象

java - 如何创建三级线程将由一个工作,一个

amazon-web-services - 为什么我的 DynamoDB 扫描速度如此之快,而且只有 1 个预配置的读取容量单位?

angularjs - 如何使用nodejs/angular删除Amazon s3文件

javascript - 在 jest(NodeJs) 中编写测试来验证对象属性