【问题标题】:DynamoDB how to make a query that have compare 2 field?DynamoDB 如何进行具有比较 2 字段的查询?
【发布时间】:2020-07-27 11:06:02
【问题描述】:

查询模式:

获取所有赞成 > 反对的帖子



架构

Post = new Schema({
  id: {
    type: String,
    hashKey: true
  },
  upvote: {
    type: Number,
  },
  downvote: {
    type: Number,
  }
});





如何实现这种查询模式?

【问题讨论】:

  • dynamodb 是超级简单的数据库,不要期望有任何花哨的查询。 Swayamraina 基本上是对的,尽管我相信最好的解决方案是他提到的or store the diff to use it in more queries。只需再创建一个具有赞成票和反对票差异的字段(您需要在代码中正确填写),然后在该新字段上使用分区键创建索引(全局二级索引)。

标签: amazon-dynamodb dynamodb-queries


【解决方案1】:

DynamoDB 根据分区键 (PK) 拆分所有数据,即您的数据被分成多个服务器进行存储。
因此,要检索数据,您至少需要传递分区键。

我相信你的用例是get all posts where upvotes > downvotes

由于这是一个全局查询,并且与 dynamodb 表中的任何分区或特定条目无关,因此您需要使用二级索引(通过 GSI 的稀疏索引)。

要实现这一点,您可以创建一个名为upvotes_gt_downvotes 的附加属性,并仅在赞成票大于反对票时存储此属性(或存储差异以在更多查询中使用它)。此外,您需要将此新属性 (upvotes_gt_downvotes) 与时间戳一起设置为 GSI 表的排序键 (SK)。

要获得结果,您必须扫描此 GSI。请注意,此 GSI 将仅包含满足您查询的记录,并且会在从记录中删除该属性后立即从 GSI 中删除。
在投票时,如果此值变为 0 或 -ve,您将不得不在更新记录时删除此属性。 (删除此属性会自动从 GSI 中删除记录)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-14
    • 1970-01-01
    • 2015-01-31
    • 2011-04-21
    • 1970-01-01
    • 2015-12-21
    • 2019-08-14
    相关资源
    最近更新 更多