在 DynamoDB 表中,其中 CustomerStatus 是其中项目可能包含“Activity ”、“非 Activity ”或“已删除”作为 CustomerStatus 的列。我想获取状态为“Activity ”和“非 Activity ”的所有客户。 这是我正在使用的代码示例,但我不确定如何完成它。
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 中所述。 。但这将从表中读取所有数据,速度可能很慢,并且会消耗大量容量。
关于java - 使用 QuerySpec 从 DynamoDB 获取记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60544563/