我正在尝试构建一个支持这 3 种访问模式的 DynamoDb 表:
- 访问给定邮政编码 XX 半径内的机构列表。
- 给定教育级别(4 年、2 年、高中等)的给定邮政编码的 XX 半径内的机构访问列表。
- 给定工作代码和教育水平的给定邮政编码的 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 按半径过滤并使用教育水平和/或工作代码等相关数据进行过滤?