- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
目标是实现高效的地理空间数据结构和查询。更准确地说,“获取给定边界矩形内的所有项目”。边界矩形将使用 longitudeMin
、longitudeMax
、latitudeMin
和 latitudeMax
定义。
所以我想到的 DynamoDB 查询应该是这样的:
KeyConditionExpression:
itemLongitude BETWEEN :longitudeMin AND :longitudeMax
and
itemLatitude BETWEEN :latitudeMin AND :latitudeMax
..其中 itemLongitude
和 itemLatitude
将是查询表的排序键。
但是,基于DynamoDB documentation , KeyConditionExpression
, 只接受一个排序键。我的理解正确吗?
虽然我知道 Geo Library项目,在深入研究我完全不熟悉的范例之前,我想知道我到底能在多大程度上利用 DynamoDB 的核心功能。
最佳答案
您说得对,DynamoDB 不支持具有多个非 EQ 条件的查询 - 您可以仅查询分区键是否相等,而可以使用 BETWEEN
等运算符比较排序键, <
, >
等等 所以为了查询让我们说
742 <= x <= 1082
113 <= y <= 305
使用普通复合键,您可以做的最好的事情可能是将数据分组,以最大限度地减少所需的查询数量,但您永远无法用一个单一的找到给定框中的所有点 查询,您还需要进行一些客户端过滤,这会消耗读取容量单位。
作为上述数据的示例,我们可以存储 floor(x / 100)
(或者,如果你愿意的话,n
零左填充 x 值的第一位数字)作为散列键,并使用 y 坐标作为排序键。一个点[1033; 278]
然后将被编码为
hash x y
10 1033 278
然后可以使用以下方式查询上面的示例:
Query (hash = 07, y BETWEEN 113 AND 305) + Filter x >= 742
Query (hash = 08, y BETWEEN 113 AND 305)
Query (hash = 09, y BETWEEN 113 AND 305)
Query (hash = 10, y BETWEEN 113 AND 305) + Filter x <= 1082
虽然这可行,但大盒子需要很多查询。客户还需要过滤结果数据并将其合并到一个数据集中。
更好的方法通常是重组数据。对于地理坐标,常见的解决方案是使用 geo hashes ,这是一种将坐标对编码为一个值的有效方法,因此彼此接近的点可能共享一个公共(public)前缀。然后可以将地理散列作为字符串进行比较,以查找特定区域内的点。
由于 DynamDB Geo library 支持其中大部分内容您已经提到过,我建议使用它来简化地理哈希和其他坐标相关转换的管理。
关于amazon-web-services - 使用 DynamoDB 的地理空间结构和查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47036101/
我是一名优秀的程序员,十分优秀!