【问题标题】:Python: how to get position/rank after sorting using dynamodb?Python:如何在使用 dynamodb 排序后获得位置/排名?
【发布时间】:2020-01-04 14:28:54
【问题描述】:

我目前正在尝试在 python 中使用dynamodb 扩展来获取索引降序查询中的位置\排名,以下是我想出的:

router.get('/'+USER_ROUTE+'/top', (req, res) => {
    POST.query()
    .usingIndex('likecount')
    .attributes(['id', 'likecount'])
    .descending()
    .loadAll()
    .exec((error, result) => {
        if (error) {
            res.status(400).json({ error: 'Error retrieving most liked post' });
        }

        //convert res to dict and sort dict by value (likecount)

        res.json({position:Object.keys(result).indexOf(req.body.id)});
    });
});

如您所见,我会将结果转换为 ID 和 likecount 的 dict,然后对 dict 进行排序,然后得到我要查找的键的索引。 显然,这在多个方面都失败了,它速度慢/效率低(每次调用都会遍历数据库中的每个项目)并且需要多个步骤。

有没有更简洁的方法来实现这一点? 谢谢。

【问题讨论】:

    标签: python nosql amazon-dynamodb


    【解决方案1】:

    没有更好的方法来做到这一点。 DynamoDB 不适合在需要复杂查询功能的场景中使用。

    此外,单个查询操作对其可以读取的文档数量有严格的限制;即使它确实支持这种查询,它也不适用于您拥有的文档多于一次读取可以处理的情况。

    【讨论】:

      【解决方案2】:

      DynamoDB 不是为排行榜设计的。为此,您应该选择另一个数据库。我建议您在您的情况下使用“DynamoDB”和“Redis”。你可以参考这篇文档来了解 Redis 排行榜:https://redislabs.com/redis-enterprise/use-cases/leaderboards/

      工作流程:

      1. 设置 Dynamo Stream => 触发事件到 Lambda 函数 => Lambda 函数将计算“点赞数”并插入到 Redis(例如:哈希是“id”,得分是“点赞数”)
      2. 当客户端触摸影响“喜欢计数”的操作 => 在 DynamoDB 中插入/更新记录 => 时,由于 Dynamo Stream,Redis 将立即更新“喜欢计数”。
      3. 客户端查询排行榜 => API 将从“Redis”查询并返回给客户端

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-26
        • 2015-05-16
        • 1970-01-01
        • 1970-01-01
        • 2021-10-24
        相关资源
        最近更新 更多