我的动态表结构如下:
{ “ id”:“ 1”, “技能”:{ “ skill1”:“ html”, “ skill2”:“ css” } }
我有任务要按技能值进行过滤,为了完成任务,我编写了如下的Java逻辑:
AmazonDynamoDB client = dynamoDBService.getClient();
DynamoDB dynamoDB = new DynamoDB(client);
Table table = dynamoDB.getTable("dummy");
Map<String, String> attributeNames = new HashMap<String, String >();
attributeNames.put("#columnValue", "skills.skill1");
Map<String, AttributeValue> attributeValues = new HashMap<String, AttributeValue>();
attributeValues.put(":val1", new AttributeValue().withS("html"));
ScanSpec scanSpec = new ScanSpec().withProjectionExpression("skills.skill1")
.withFilterExpression("#columnValue = :val1 ").withNameMap(new NameMap().with("#columnValue", "skills.skill1"))
.withValueMap(new ValueMap().withString(":val1", "html"));
ItemCollection<ScanOutcome> items = table.scan(scanSpec);
Iterator<Item> iter = items.iterator();
while (iter.hasNext()) {
Item item = iter.next();
System.out.println("--------"+item.toString());
}
上述代码对我没有帮助。有解决方案吗?
答案 0 :(得分:0)
此问题的简单解决方案是:
首先从表中获取所有记录。
然后遍历该对象的列表。
从每个对象中提取技能。
编写逻辑进行过滤。
重复循环直到最后一条记录。
答案 1 :(得分:0)
您可以使用ProjectionExpression来检索特定的属性或元素,而不是整个项目。 ProjectionExpression可以使用文档路径指定顶级或嵌套属性。
例如来自AWS的
GetItemSpec spec = new GetItemSpec()
.withPrimaryKey("Id", 206)
.withProjectionExpression("Id, Title, RelatedItems[0], Reviews.FiveStar")
.withConsistentRead(true);
Item item = table.getItem(spec);
System.out.println(item.toJSONPretty());
答案 2 :(得分:0)
我找到了解决方案,scanSpec应该如下:
ScanSpec scanSpec = new ScanSpec()
.withFilterExpression("#category.#uid = :categoryuid").withNameMap(new NameMap().with("#category","skills").with("#uid",queryString))
.withValueMap(new ValueMap().withString(":categoryuid", queryString));