使用QuerySpec从DynamoDB获取记录

2020年8月14日 41点热度 0条评论

在DynamoDB表中,其中CustomerStatus是一列,其中项目可能包含“有效”,“无效”或“已删除”作为CustomerStatus。我想获取状态为“有效”以及“无效”的所有客户。
这是我正在使用的代码示例,但是我不确定如何完成它。

private Object data(MuleEventContext eventContext) {
    List<Object> finalJson = new ArrayList<Object>();


        String tableName = "Customers";

        NameMap nameMap = new NameMap();
        nameMap.put("#v_status", "CustomerStatus");
        ValueMap valueMap = new ValueMap();
        valueMap.put(":v_statusval", "Deleted");
        BasicAWSCredentials cre = new BasicAWSCredentials(accesKey,secretKey);
        AmazonDynamoDB dynamoDB1 = AmazonDynamoDBClientBuilder.standard()
                .withCredentials(new AWSStaticCredentialsProvider(cre)).withRegion(Regions.EU_WEST_1).build();
        DynamoDB dynamoDB = new DynamoDB(dynamoDB1);
        Table table = dynamoDB.getTable(tableName);


        QuerySpec querySpec = new QuerySpec().withKeyConditionExpression("#v_status != :v_statusval")
            .withNameMap(nameMap)
            .withValueMap(valueMap);



         ItemCollection<QueryOutcome> items = null;
         Iterator<Item> iterator = null;
         Item item = null;

    try {               
            items = table.query(querySpec);
            iterator = items.iterator();                
            while (iterator.hasNext()) {
                item = iterator.next();
                finalJson.add(item.asMap());
            }

    } catch (Exception e) {
        logger.info(e.getMessage());
    }


    return finalJson;
}

解决方案如下:

您无法筛选HASH密钥。

我需要知道哪个属性是HASH键,哪个是RANGE键。

如果CustomerStatus不是HASH密钥,则最好的方法是为此属性创建一个二级索引并执行2个不同的查询:

一个为主动;
另一个为非活动状态。

这是执行这种查询的最有效方法。

另一种方法是使用IN操作数进行扫描并过滤属性,如Syntax for Condition Expressions中所述。但这会从您的表中读取所有数据,速度可能很慢,并且会消耗大量容量。