Java 在dynamodb中获取映射字符串

Java 在dynamodb中获取映射字符串,java,amazon-dynamodb,Java,Amazon Dynamodb,我有dynamodb表格结构如下: AmazonDynamoDB client = dynamoDBService.getClient(); DynamoDB dynamoDB = new DynamoDB(client); Table table = dynamoDB.getTable("dummy"); Map<String, String> attributeNames = new HashMap<String, String &

我有dynamodb表格结构如下:

 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()); 
         } 
ScanSpec scanSpec = new ScanSpec()
                  .withFilterExpression("#category.#uid = :categoryuid").withNameMap(new NameMap().with("#category","skills").with("#uid",queryString)) 
                     .withValueMap(new ValueMap().withString(":categoryuid", queryString));
{ id:1, 技能:{ 技能1:html, 技能2: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()); 
         } 
ScanSpec scanSpec = new ScanSpec()
                  .withFilterExpression("#category.#uid = :categoryuid").withNameMap(new NameMap().with("#category","skills").with("#uid",queryString)) 
                     .withValueMap(new ValueMap().withString(":categoryuid", queryString));

上面提到的代码对我没有帮助。有什么解决办法吗?

这个问题的简单解决办法是:

首先从表中取出所有记录

然后迭代该对象的列表

从每个对象中提取技能

写下你的逻辑来做过滤

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

可以使用仅检索特定属性或元素,而不是检索整个项。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());

我找到了解决方案,scanSpec应如下所示:

 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()); 
         } 
ScanSpec scanSpec = new ScanSpec()
                  .withFilterExpression("#category.#uid = :categoryuid").withNameMap(new NameMap().with("#category","skills").with("#uid",queryString)) 
                     .withValueMap(new ValueMap().withString(":categoryuid", queryString));

您能详细说明一下您想做什么吗?正如我在查询中提到的,我想通过技巧、html或css获取单行。。等等。例如:从表_name中选择*,其中skills=html,css,…作为指定的代码片段,我只有skill值要过滤。如何通过GettemSpec获取??或者Java中的任何其他示例???很抱歉,这些方法不是最佳实践