我正在尝试使用DynamoDB和API网关创建一个简单的“记分板”。我可以直接从Dynamo中拉出,但我只想显示前10行。基本上,API Gateway应该只返回前10个得分。数据库使用一个共享值作为其分区键以返回所有内容。我将排序键设置为时间戳,以确保每一行都是唯一的。其他两列是“昵称”和“得分”。我希望能够仅根据得分列拉出前10行。有任何想法吗?
这是我的映射模板:
{
"TableName": "pacman",
"KeyConditionExpression": "entire = :v1 AND recordTime > :v2",
"ExpressionAttributeValues": {
":v1": {
"S": "$input.params('entire')"
},
":v2": {
"S": "$input.params('recordTime')"
}
}
}
现在,它成功返回了表中的所有行。
答案 0 :(得分:1)
在没有score
作为表的排序键的情况下,您将需要执行全表扫描,随着时间的流逝,扫描会变得越来越昂贵,尤其是随着数据库的增长。如果已知您的数据具有一致的架构,则RDS (MySQL, PostgreSQL) alternatives may be the better tool for the job.
如果在DynamoDB上进行了设置,则取决于您的访问模式,并且如果发现自己始终在执行此操作,则可以使用另一个以score
作为排序键的表。您可以通过创建自动与基表同步的Global Secondary Index或Local Secondary Index来完成此操作。该页面上有一个有用的示例,其中包含记分板,非常类似于您要寻找的内容。
一旦有了第二个索引,或者将排序键更改为score
,就可以在应用程序代码中以下列约束执行更高效的query
:
将ScanIndexForward
参数设置为false
,以降序执行搜索(从最高分开始)
将limit
参数设置为10
,以在返回最大项目数后停止进一步查询DynamoDB
作为查询,它类似于以下内容:
QueryParam = {
TableName: 'pacman',
IndexName: 'ScoreIndex', // Name of your local/global secondary index
KeyConditionExpression: "Score = :Score ", // Shared partition key
ExpressionAttributeValues: {
":UserId": UserId,
},
ScanIndexForward: false, // false for descending order
Limit: 10 // Limit response to 10 items
}
或者,您可以通过making it a unique combination of date
and score
对主键进行更改,以便能够有效地查询多个参数。