DynamoDB仅更新JSON的一部分

问题描述 投票:0回答:1

我有一个dynamoDB表。

+---------------------------------------------------+
| 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更新为false。

一种方法是进行调用并获取JSON,然后迭代JSON并更新值,然后将新的JSON放回Dynamo DB中。这意味着它将进行2次通话 A)获取数据和 B)将数据放入DB。

有没有更好的方法可以直接更新数据并避免进行额外的网络调用?我可以将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);

有没有更好的方法来实现我想要的?

谢谢

database-design amazon-dynamodb
1个回答
0
投票

从您的问题看,您正在存储字符串化的JSON。如果是这样,update将无法帮助你,但据我所知,存储字符串化的JSON没有价值,而不是使用dynamodb地图和列表。

您可以使用update在地图或列表中设置嵌套属性。使用map而不是gamestats属性的列表更好,因为那样你就不必担心属性的顺序了。

Gamestats是地图的Javascript示例。

dynamodb.update({
  TableName: table,
  Key: key,
  UpdateExpression: 'SET #gs.#qs.#status = :newStatus',
  ExpressionAttributeNames: {'#gs': 'Gamestats', '#qsm': 'QuickShootingMode', '#s': 'status' },
  ExpressionAttributeValues: { ':newStatus': false }
}, callback)
© www.soinside.com 2019 - 2024. All rights reserved.