Alexa技能中的Dynamo DB排行榜

问题描述 投票:0回答:1

我正在尝试使用dynamo db创建排行榜,以实现测验风格的Alexa技能。我已经设置好表格,并使用适当的数据将用户添加到表格中,例如:

Item: {
    "PlatformId": 2,
    "UserId": 12345,
    "Score": 100,
    "NickName": "scott",
    "Sport": "football",
}

在我的表中,主键是他们的UserId,排序键是PlatformId(这对于所有用户都是相同的)。我有一个辅助全局索引,该索引将platformId设置为主键,将score设置为排序键。

在这个排行榜中,我希望用户排名,得分最高的人是数字1,我​​的第一次尝试是使用二级索引扫描表格,这很好地返回了按分数排序的所有用户,但是有可能在这个排行榜上有成千上万的用户,我发现与10000+用户一起扫描表的时间超过了Alexa技能的8秒响应时间。这会导致该技能出错并关闭。

在超出响应时间之前,如果第一个未覆盖整个表,则我使用LastEvaluatedKey进行额外的扫描,但是第二次扫描是超过响应时间限制的。令人讨厌的是,扫描表只需要太长时间。

dbHelper.prototype.scanGetUsers = (ad, newParams = null) => {
return new Promise((resolve, reject) => {
    let params = {};
    if (newParams != null) {
        params = newParams
    } else {
        params = {
            TableName: tableName,
            IndexName: 'PlatformId-Score-index',
            FilterExpression: "Score >= :s AND PlatformId = :p",
            ProjectionExpression: `NickName, Sport, Score`,
            // Limit: 10,
            ExpressionAttributeValues: {
                ":p": User.PlatformId,
                ":s": User.Score,
            },
        }
    }

    docClient.scan(params, function (err, data) {
        if (err || !data) {
            console.error("Unable to read item. Error JSON:", JSON.stringify(err, null, 2));
            return reject(JSON.stringify(err, null, 2))
        } else {
            console.log("scan users data succeeded:", JSON.stringify(data, null, 2));
            if(data.LastEvaluatedKey) {
                console.log("found a LastEvalutedKey, Continuing scan");
                params.ExclusiveStartKey = data.LastEvaluatedKey;
                data = data.concat(this.scanGetUsers(ad, params));
            }
            resolve(data);
        }
    });
});

}

是否有解决我尚未探讨的问题的方法?还是用dynamo db创建排行榜的方法,可以更简单地构造它?

amazon-dynamodb alexa alexa-skill leaderboard dynamodb-scan
1个回答
0
投票

您可以尝试Sort Key

当您组合分区键和排序键时,它们会创建一个组合键,并且该组合键是表中各个项目的主键。使用复合键,您可以对排序键使用带有KeyConditionExpression的查询。在查询中,可以使用KeyConditionExpression通过使用比较运算符来编写条件语句,这些比较运算符可对键进行求值并限制返回的项。换句话说,您可以使用特殊的运算符通过其排序键值来包含,排除和匹配项。

本文包含有关如何设置和使用它的所有信息。

© www.soinside.com 2019 - 2024. All rights reserved.