Kry*_*ian 3 javascript amazon-dynamodb aws-lambda
我有一个 lambda 函数,它作为一个表上的触发器,拥有最好的用户分数来处理排行榜表。
在我的排行榜表中,排序键是分数,玩家的名字是一个单独的条目,带有一个列表,因为可能有多个玩家的分数相同。没关系。
因此,在添加播放器时,我会这样做:
var paramsNewEntry = {
"TableName": leaderboardTable,
"Key": {
"trackId": trackId,
"time": newValue
},
"UpdateExpression": "SET players = list_append(if_not_exists(players, :emptyList), :playersList),
"ExpressionAttributeValues": {
":playersList": [userId],
":emptyList":[]
},
"ReturnValues": "NONE"
};
Run Code Online (Sandbox Code Playgroud)
这工作正常。我想以这种方式删除它:
var paramsOldEntry = {
"TableName": myTable,
"Key": {
"trackId": trackId,
"time": oldValue
},
"UpdateExpression": "DELETE players :playerToRemove",
"ExpressionAttributeValues": {
":playerToRemove": [userId]
},
"ReturnValues": "ALL_NEW"
}
Run Code Online (Sandbox Code Playgroud)
但我得到:Invalid UpdateExpression: Incorrect operand type for operator or function; operator: DELETE, operand type: LIST错误。
该players属性是一个列表,查询响应示例:
{
"Items": [
{
"time": {
"N": "99994"
},
"players": {
"L": [
{
"S": "krystianPostman2"
}
]
},
"trackId": {
"S": "betaTrack001"
}
}
],
"Count": 1,
"ScannedCount": 1,
"LastEvaluatedKey": {
"time": {
"N": "99994"
},
"trackId": {
"S": "betaTrack001"
}
}
}
Run Code Online (Sandbox Code Playgroud)
在使用 dynamodb 文档 API 时,我没有看到任何关于 SO 的问题,这些问题会在 javascript 中提供有关此的任何详细信息。
DynamoDB API 没有根据值从 LIST 数据类型中删除值的选项。但是,如果您知道要删除的值的索引,则可以使用REMOVE从列表中删除条目。
DELETE 操作仅支持 Set 数据类型。
UpdateExpression: 'REMOVE players[0]'
Run Code Online (Sandbox Code Playgroud)
如果 LIST 将只有name属性,最好将其保存为 SET 而不是 LIST DynamoDB 数据类型。
创建集:-
var docClient = new AWS.DynamoDB.DocumentClient();
docClient.createSet( ["v1", "v2"]);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3881 次 |
| 最近记录: |