Amazon dynamodb 如何只更新JSON的一部分?

Amazon dynamodb 如何只更新JSON的一部分?,amazon-dynamodb,Amazon Dynamodb,我有一张DynamoDB桌子: +--------------------------------------------------+ | Customer ID (Primary Key)|Gamestats (JSON entry) | +--------------------------------------------------+ JSON: 我只想更新JSON的一部分。最好的方法是什么?例如,将QuickShootingMode更新为false 一种方法是调用并获取JSON,

我有一张DynamoDB桌子:

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

我只想更新JSON的一部分。最好的方法是什么?例如,将
QuickShootingMode
更新为false

一种方法是调用并获取JSON,然后迭代JSON并更新值,然后将新的JSON放回dynamo DB。这意味着它将拨打2个电话
A) 获取数据和
B) 将数据放入数据库

有没有更好的方法可以让我直接更新数据,避免打这些额外的网络电话?我可以将JSON中的每个键转换为dynamo 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);
 
Map key=newhashmap();
AmazonDynamoDB dynamoDB=dynamoDBClient.getDynamoDB();
key.put(USER_ID_key,new AttributeValue(),带有(“xyz”);
key.put(“Gamedata”,新的AttributeValue().with(“一些JSON”);
PutItemRequest=新的PutItemRequest()
.withTableName(表)
.带项目(键);
PutItemResult=dynamoDB.putItem(请求);

有没有更好的方法来实现我的目标?

从您的问题来看,您正在存储字符串化JSON。如果是这样的话,
update
对您没有帮助,但据我所知,存储字符串化的JSON而不是使用dynamodb映射和列表是没有价值的

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

以Gamestats为地图的Javascript示例

dynamodb.update({
TableName:table,
钥匙:钥匙,
UpdateExpression:'SET#gs.#qs.#status=:newStatus',
expressionAttribute名称:{'#gs':'Gamestats','#qs':'QuickShootingMode','#status':'status'},
表达式属性值:{:newStatus':false}
},回调)

使用更新api。这会更新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);