在dynamodb中获取地图的字符串

时间:2018-12-29 12:27:09

标签: java amazon-dynamodb

我的动态表结构如下:

{   “ 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()); 
         } 

上述代码对我没有帮助。有解决方案吗?

3 个答案:

答案 0 :(得分:0)

此问题的简单解决方案是:

  1. 首先从表中获取所有记录。

  2. 然后遍历该对象的列表。

  3. 从每个对象中提取技能。

  4. 编写逻辑进行过滤。

  5. 重复循环直到最后一条记录。

答案 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));