我可以在我的 DynamoDB table 上列出所有包含这些值的项目吗?

Can I List all items that contain these values on my DynamoDB table?

我有一个 DynamoDB table 包含具有以下结构的项目:

{
  "applicationName": { //PARTITION KEY
    "S": "FOO_APP"
  },
  "requestId": { // SORT KEY
    "S": "zzz/yyy/xxx/58C28B6"
  },
  "creationTime": {
    "N": "1636332219136"
  },
  "requestStatus": {
    "S": "DENIED"
  },
  "resolver": {
    "S": "SOMEONE"
  }
}

在 DynamoDB 中,我可以查询此 table 以 列出 applicationNamerequestStatus 提供的值相匹配的所有项目,并且, resolver?

换句话说,我如何列出所有匹配项:

有了这个 table 设计,我需要 GSI 吗?我可以进行查询还是扫描?

完成这项任务最具成本效益、最有效的方法是什么?

我正在使用 Java 的 DynamoDBMapper

您可能无法查询此模式作为您的排序键 - requestId 不在条件中。这意味着,您的查询将失败。为了更好的模式设计,您应该有一个排序键,这样可以帮助您缩小仅通过查询 PartitionKey 获得的结果集。

因此,对于解决方案,您必须按如下方式创建新索引:

applicationName -> Partition Key

requestStatus -> Sort Key

resolver

然后您可以使用 applicationName 上的 keyConditionExpression 和 requestStatus 上的 resolver 上的 filterExpression 进行查询。

您可以添加另一个属性来组合您要查询的值,如下所示:

GSI1PK: <applicationName>#<requestStatus>#<resolver>

然后定义一个全局二级索引 (GSI1),分区键为 GSI1PK,排序键类似于当前排序键 requestId

每当你想找到符合这三个条件的所有请求时,你构建你的搜索事物并查询全局二级索引:

Query @GSI1
Partition Key = FOO_APP#DENIED#SOMEONE

这将生成所有符合条件组合的请求。这种反规范化在 DynamoDB 等 NoSQL 数据库中很常见。