DynamoDB обновляет только часть JSON - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть динамо-таблица БД.

+---------------------------------------------------+
| Customer ID (Primary Key)|Gamestats (JSON entry) |
+---------------------------------------------------+

JSON

{
  "Gamestats": [
    {
      "ID": "QuickShootingMode",
      "status": 1
    },
    {
      "ID": "FastReloadMode",  // Just want to update this and not update the entire JSON
      "status": 0
    }
  ],
  "CustomerID": "xyz"
}

Я хочу обновить только части JSON, как лучше всего это сделать?Например, обновите QuickShootingMode, чтобы быть ложным.

Одним из способов является вызов и выборка JSON, а затем итерация JSON, обновление значения и помещение нового JSON обратно в базу данных Dynamo.Это означает, что для получения данных потребуется 2 вызова
A) и
B) для помещения данных в БД.

Есть ли лучший способ, с помощью которого я мог бы напрямую обновлять данные и избегать дополнительных сетевых вызовов?Я мог бы преобразовать каждый ключ JSON в столбец в динамическом BD, но если количество ключей возрастет, у меня будет много столбцов (что может быть плохим дизайном), поэтому я думаю, что JSON будет сохранен в одномколонка «Статистика игры» будет иметь больше смысла.

Map<String, AttributeValue> key = new HashMap<>();   
    AmazonDynamoDB dynamoDB = dynamoDBClient.getDynamoDB();
    key.put(USER_ID_KEY, new AttributeValue().withS("xyz"));
    key.put("Gamedata", new AttributeValue().withS("some JSON"));
    PutItemRequest request = new PutItemRequest()
            .withTableName(table)
            .withItem(key);

 PutItemResult result = dynamoDB.putItem(request);

Есть ли лучший способ добиться того, чего я хочу?

Спасибо

1 Ответ

0 голосов
/ 17 сентября 2018

Похоже, из вашего вопроса вы храните строковый JSON. Если это так, update вам не поможет, но, насколько я могу судить, нет смысла хранить строковый JSON вместо использования карт и списков DynamodB.

Вы можете использовать update , чтобы установить вложенный атрибут на карте или в списке. Лучше использовать карту вместо списка для атрибута gamestats, так как вам не нужно беспокоиться о порядке атрибутов.

Пример Javascript с Gamestats, являющимся картой.

dynamodb.update({
  TableName: table,
  Key: key,
  UpdateExpression: 'SET #gs.#qs.#status = :newStatus',
  ExpressionAttributeNames: {'#gs': 'Gamestats', '#qsm': 'QuickShootingMode', '#s': 'status' },
  ExpressionAttributeValues: { ':newStatus': false }
}, callback)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...