Dynamodb 根据时间和喜好获取项目

Dynamodb get items based on time and likes

目前,我正在制作一个 9gag.com 副本,用户可以在其中看到 posts 从上次 中获得超过 20 票 ]2个月,我怎样才能高效地做到这一点?

这是我目前为 post table

设计的
userID | createTime | totalUpvotes | imageUrl | title

其中 userID 是分区键,createTime 是排序键,我还需要分页,所以最后这是我获取项目的参数:

const params = {
    TableName: TABLE_NAME,
    FilterExpression:
      '#createTime >= :_createTime AND #totalUpvotes >= :_votes',
    ExpressionAttributeNames: {
      '#createTime': 'createTime',
      '#totalUpvotes': 'totalUpvotes'
    },
    ExpressionAttributeValues: {
      ':_createTime': Date.now() - FEED_TIME_THRESHOLD,
      ':_votes': votes
    },
    Limit: MAX_POST_FETCH
};
if (lastEvaluatedKey) params.ExclusiveStartKey = lastEvaluatedKey;
return db.scan(params).promise();

我知道 scan 功能不推荐,但我正在考虑使用 Redis 缓存 posts,并重新 运行 扫描 每 20 分钟左右操作一次,因为所有用户都应该在我的网站上看到相同的内容。

创建一个属性 popular,其值仅适用于热门项目(即 20+ 赞成票)。您可以使用一个简单的常量作为值。然后创建一个(稀疏)GSI,其中 popular 作为 PK,createTime 作为 SK。然后,您可以在 GSI 中查询 createTime 大于两个月前的热门商品。