在dynamodb中存储JSON的可能方法

时间:2018-04-26 04:58:47

标签: java json amazon-web-services amazon-dynamodb

我正在开发一个实现,我的系统将与外部应用程序集成。这个外部应用程序为每个请求生成长而不同的json。

我想将这个json存储在dynamodb中,这样做的最佳方法是什么?目前,我已经创建了一个具有以下属性的POJO类。在这个定义属性中,我将API响应json设置为字符串。

this.dynamoDBMapper.save(obj);

然后创建POJO的对象,并使用@DynamoDBTable(tableName = "job") public class Job { @DynamoDBHashKey(attributeName = "inbound_job") private Long inboundId; @DynamoDBAttribute(attributeName = "outbound_job") private Long outboundId; @DynamoDBAttribute(attributeName = "definition") private String definition; }

将其保存到dynamodb

问题:

1 - 这是将scod中的JSON存储为字符串的好方法吗?

2 - 如果我想在dynamodb中搜索这个json的任何属性怎么办?

3 - 有没有更好的方法存储这个json,所以它也可以搜索?

此外,这个json总是不同,所以我无法将它映射到POJO类,这就是我试图将它存储为字符串的原因。

下面是我存储在dynamo db中的示例POJO对象。

{
    "inbound_job": {
        "N": "3138788"
    },
    "outbound_id": {
        "N": "909092"
    },
    "jobDefinition": {
        "S": "{\r\n\t\"_id\": \"5ae1d9848376948a370d6962\",\r\n\t\"index\": 4,\r\n\t\"guid\": \"32bb8da0-a84a-4b3c-8775-c20216fa04b7\",\r\n\t\"isActive\": true,\r\n\t\"balance\": \"$2,683.96\",\r\n\t\"picture\": \"http:\/\/placehold.it\/32x32\",\r\n\t\"age\": 38,\r\n\t\"eyeColor\": \"brown\",\r\n\t\"name\": \"Swanson Hughes\",\r\n\t\"gender\": \"male\",\r\n\t\"company\": \"BIOSPAN\",\r\n\t\"email\": \"swansonhughes@biospan.com\",\r\n\t\"phone\": \"+1 (999) 559-2315\",\r\n\t\"address\": \"851 Lyme Avenue, Shepardsville, American Samoa, 8015\",\r\n\t\"about\": \"Sit officia culpa in est Lorem. Officia occaecat nostrud Lorem officia non sint enim excepteur. Laboris dolore consectetur velit occaecat ullamco non nisi.\\r\\n\",\r\n\t\"registered\": \"2015-12-12T11:22:53 +08:00\",\r\n\t\"latitude\": 47.732205,\r\n\t\"longitude\": -164.823761,\r\n\t\"tags\": [\r\n\t\t\"velit\",\r\n\t\t\"anim\",\r\n\t\t\"id\",\r\n\t\t\"tempor\",\r\n\t\t\"et\",\r\n\t\t\"eu\",\r\n\t\t\"amet\"\r\n\t],\r\n\t\"friends\": [{\r\n\t\t\t\"id\": 0,\r\n\t\t\t\"name\": \"Kaye Fields\"\r\n\t\t},\r\n\t\t{\r\n\t\t\t\"id\": 1,\r\n\t\t\t\"name\": \"Knapp Reed\"\r\n\t\t},\r\n\t\t{\r\n\t\t\t\"id\": 2,\r\n\t\t\t\"name\": \"Hodge Morse\"\r\n\t\t}\r\n\t],\r\n\t\"greeting\": \"Hello, Swanson Hughes! You have 3 unread messages.\",\r\n\t\"favoriteFruit\": \"strawberry\"\r\n}"
    }
}

下面是各种json存储在dynamodb中。

body{
  background: #EEE;
}
.center-div{
  position: absolute;
  width: 200px;
  height: 60px;
  left: 50%;  
  margin-left: -100px;
  top: 50%;
  margin-top: -30px;
  background: #CCC;
  color: #000;
  text-align: center;
}

我还想通过“definition”属性的任何json属性进行搜索。

让我知道你的想法。

问候。

2 个答案:

答案 0 :(得分:1)

是的,这是存储任意json数据的好方法。

然后,您可以在查询和扫描中使用document path来查找和检索部分响应。保存json时不需要做任何特殊操作(除了确保json被正确转义)。

值得注意的是,您只能索引顶级DynamoDB项目属性。这意味着您对响应内容所做的任何“搜索”都将是一次扫描,它将评估表中的每个响应。

如果您要索引任何(可靠/一致)属性,则需要从json中提取它们并使它们成为POJO上的属性。

答案 1 :(得分:0)

您可以使用Table.putItem,而不是使用dynamoDBMapper。 请参考DynamoDB Java docs将任何免费的json更新为dynamodb。

以上链接的重点(针对您的用例进行了调整):

    AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard()
        .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration("http://localhost:8000", "us-west-2"))
        .build();
    DynamoDB dynamoDB = new DynamoDB(client);
    Table table = dynamoDB.getTable("YourTableName");
    try {
      table.putItem(new Item().withPrimaryKey("hashKeyName", hashKeyValue).withJSON("definition", definition);
      System.out.println("PutItem succeeded: " );
    }
    catch (Exception e) {
      System.err.println(e.getMessage());
      break;
    }