4

我正在尝试构建一个支持这 3 种访问模式的 DynamoDb 表:

  1. 访问给定邮政编码 XX 半径内的机构列表。
  2. 给定教育级别(4 年、2 年、高中等)的给定邮政编码的 XX 半径内的机构访问列表。
  3. 给定工作代码和教育水平的给定邮政编码的 XX 半径内的机构访问列表。

分区键是作为 DynamoDb 的地理库(AWS 地理库)的一部分生成的。所以基本上,我通过地理位置将机构分组在一起,支持在提供的邮政编码的 XX 半径内搜索机构的能力(使用邮政编码的纬度/经度)。

下面是我的 DynamoDb 表的 CloudFormation 模板:

    dynamoDbInstitutions:
    Type: AWS::DynamoDB::Table
    Properties:
        TableName: institutions
        AttributeDefinitions:
            - AttributeName: hashKey
              AttributeType: N
            - AttributeName: rangeKey
              AttributeType: S
            - AttributeName: geohash
              AttributeType: N
        KeySchema:
            - AttributeName: hashKey
              KeyType: HASH
            - AttributeName: rangeKey
              KeyType: RANGE
        ProvisionedThroughput: 
            ReadCapacityUnits: 50
            WriteCapacityUnits: 2
        LocalSecondaryIndexes:
        - IndexName: geohash-index
          KeySchema:
          - AttributeName: hashKey
            KeyType: HASH
          - AttributeName: geohash
            KeyType: RANGE
          Projection:
            ProjectionType: ALL

这是我表中的数据示例:

在此处输入图像描述

  • 176008代表一个机构。
  • 2代表教育水平(4 年制)。
  • 11-1011.00代表工作代码

Hashkey 值 966762 是 GeoHash 值的前 6 位。这使我可以按距离将机构分组。这使我可以搜索半径范围内的机构。我有一个使用 Hashkey 和 GeoHash 的本地二级索引 (LSI)。我的查询是使用 LSI 查找半径内的机构。

我还希望能够通过这些访问模式进一步过滤半径内的机构:

  • 教育水平。示例:2_*
  • 工作代码和教育程度。示例:11-1011.00_2_*

我遇到了一堵墙,DynamoDb 只允许基于 2 个关键条件进行查询。为了进行地理查询(在半径内),我必须使用哈希键和 LSI(使用 geohash)。我被阻止使用我的范围键进行进一步过滤,该范围键是对机构与教育水平和工作代码的关系进行建模。

如何使用 DynamoDb 按半径过滤并使用教育水平和/或工作代码等相关数据进行过滤?

4

0 回答 0