Возможные способы хранения JSON в DynamodB - PullRequest
0 голосов
/ 26 апреля 2018

Я работаю над реализацией, в которой моя система будет интегрирована с внешним приложением.Это внешнее приложение генерирует длинный и различный json для каждого запроса.

Я хочу сохранить этот json в DynamodB, что будет лучшим подходом для этого?В настоящее время я создал класс POJO со свойством ниже.В этом свойстве определения я задаю ответ API json в виде строки.

@DynamoDBAttribute(attributeName = "definition")
private String definition;

Затем создайте объект POJO и сохраните его в Dynamodb, используя this.dynamoDBMapper.save(obj);

Вопросы:

1 - Является ли это хорошим подходом для сохранения JSON в Dynamodb в виде строки?

2 - Что, если я хочу выполнить поиск по любому свойству этого JSON в DynamodB?

3 - Есть лилучший способ сохранить этот json, чтобы его также можно было искать?

Кроме того, этот json всегда отличается, поэтому я не могу сопоставить его с классом POJO, поэтому я пытаюсь сохранить его в виде строки.

Ниже приведен пример моего объекта 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;
}

Ниже приведен соответствующий json, хранящийся в динамодебе.

{
    "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 атрибута "Definition".

Дайте мне знать ваши мысли.

С уважением.

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Да, это хороший способ хранения произвольных данных json.

Затем вы можете использовать путь к документу в своих запросах и сканировании для поиска и получения частей ответов.Вам не нужно делать ничего особенного, когда вы сохраняете json (кроме того, чтобы убедиться, что json правильно экранирован).

Стоит отметить, что вы можете индексировать только атрибуты элемента DynamoDB верхнего уровня.Это означает, что любой «поиск», который вы выполняете по содержанию вашего ответа, будет сканированием, в котором будут оцениваться все ответы в таблице.

Если есть какие-либо (надежные / непротиворечивые) атрибуты, которые вы хотите проиндексировать, вам понадобитсяизвлечь их из json и сделать их атрибутом POJO.

0 голосов
/ 26 апреля 2018

Вместо DynamoDBMapper вы можете использовать Table.putItem.См. 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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...