我有一个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);
有没有更好的方法来实现我想要的?
谢谢
从您的问题看,您正在存储字符串化的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)