【问题标题】:How can I query DynamoDB with sort and limit for a non sort key parameter?如何使用非排序键参数的排序和限制查询 DynamoDB?
【发布时间】:2023-03-13 23:26:01
【问题描述】:

我正在尝试使用 DynamoDB 和 API Gateway 创建一个简单的“记分牌”。我可以直接从 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')"
        }
    }
}

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

【问题讨论】:

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


【解决方案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 对主键进行更改,以便能够有效地跨多个参数进行查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-08
    • 2019-05-19
    相关资源
    最近更新 更多