【发布时间】:2018-04-14 19:22:40
【问题描述】:
我有一个 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"
};
这很好用。我想这样删除它:
var paramsOldEntry = {
"TableName": myTable,
"Key": {
"trackId": trackId,
"time": oldValue
},
"UpdateExpression": "DELETE players :playerToRemove",
"ExpressionAttributeValues": {
":playerToRemove": [userId]
},
"ReturnValues": "ALL_NEW"
}
但我得到: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"
}
}
}
在使用 dynamodb 文档 API 时,我没有看到任何关于 SO 的问题,它会在 javascript 中提供任何详细信息。
【问题讨论】:
-
如果列表中有多个值,您只需从列表中删除一个条目?
-
没关系,删除指定的条目即可。它始终是一个列表,如果在我删除最后一个列表后没有其他值,我将在响应数据中检测到并完全删除该条目。
-
在否决我的问题时,我非常感谢您的评论。为什么投反对票?不合适吗?缺少示例/代码示例?
-
有点问题,但使用 Redis 是排行榜的一个不错的选择。它有一种称为sorted set 的类型,非常适合排行榜。它使添加和更新高分变得非常简单,消除了这一点的逻辑。但是,请了解您是否希望使架构更简单并可能降低成本。
标签: javascript amazon-dynamodb aws-lambda