如何使用非排序键参数的排序和限制查询DynamoDB?

时间:2019-06-17 19:41:19

标签: amazon-web-services amazon-dynamodb aws-api-gateway

我正在尝试使用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')"
        }
    }
}

现在,它成功返回了表中的所有行。

1 个答案:

答案 0 :(得分:1)

在没有score作为表的排序键的情况下,您将需要执行全表扫描,随着时间的流逝,扫描会变得越来越昂贵,尤其是随着数据库的增长。如果已知您的数据具有一致的架构,则RDS (MySQL, PostgreSQL) alternatives may be the better tool for the job.

如果在DynamoDB上进行了设置,则取决于您的访问模式,并且如果发现自己始终在执行此操作,则可以使用另一个以score作为排序键的表。您可以通过创建自动与基表同步的Global Secondary IndexLocal 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对主键进行更改,以便能够有效地查询多个参数。