【问题标题】:Dynamo DB leader board within an Alexa SkillAlexa Skill 中的 Dynamodb 排行榜
【发布时间】:2020-09-13 09:48:41
【问题描述】:

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

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

在我的表中,主键是他们的 UserId,排序键是 PlatformId(这对所有用户都是一样的)。我有一个二级全局索引,它将 platformId 设置为主键,将分数设置为排序键。

在这个排行榜中,我希望对用户进行排名,得分最高的人是第一名,我的第一次尝试是使用二级索引扫描表格,这很好地返回了按分数排序的所有用户,但是有潜力为了在这个排行榜上有成千上万的用户,我发现扫描一个有 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


    【解决方案1】:

    你可以试试Sort Key:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-05
      • 2017-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多