Amazon dynamodb 用于查询附近坐标的DynamoDB模式

Amazon dynamodb 用于查询附近坐标的DynamoDB模式,amazon-dynamodb,Amazon Dynamodb,我正在为存储位置的表的DynamoDB模式设计而苦苦挣扎。该表将具有[userId、lastUpdateTime、locationGooglePlaceId、经度、纬度、hideOnUI(bool)] 其中一个主要查询是给定用户当前位置(x,y)作为GPS坐标,根据其经度和纬度查询附近的用户ID 问题是我如何为此目的设计索引?表本身可以有哈希键UserId、排序键lastUpdateTime;但GSI会怎么走?我似乎无法识别“equal”操作的任何分区键 在SQL中,它将类似于: 从表中选择*

我正在为存储位置的表的DynamoDB模式设计而苦苦挣扎。该表将具有[userId、lastUpdateTime、locationGooglePlaceId、经度、纬度、hideOnUI(bool)]

其中一个主要查询是给定用户当前位置(x,y)作为GPS坐标,根据其经度和纬度查询附近的用户ID

问题是我如何为此目的设计索引?表本身可以有哈希键UserId、排序键lastUpdateTime;但GSI会怎么走?我似乎无法识别“equal”操作的任何分区键

在SQL中,它将类似于:

从表中选择*
其中x-c首先,我不确定DynamoDB是否适合这里,也许最好使用另一个数据库,因为Dynamo不支持复杂的索引

尽管如此,这里有一个设计,你可以尝试

首先,您可以将地图拆分为多个方形块,每个方形块都有一个id,以及已知的位置和大小

然后,如果您有一个位置,并且希望找到所有附近的点,您可以执行以下操作

数据库中的每个点都将存储在Points表中,并具有以下键:

块id(字符串、UUID、分区键)-此点所属块的id

纬度(数字、排序键)-点的纬度

长度(数字)-简单属性

现在,如果您知道用户位置所在的方格以及附近的方格,则可以在所有附近的方格中执行以下搜索:

BlockId = <nearby_block_id>
Latitute between(y-c, y+c)
这里使用什么作为排序键纬度或经度并不重要

Between是DynamoDB运算符,可与排序键一起使用或用于筛选表达式:

介于:大于或等于第一个值,小于或 等于第二个值。AttributeValueList必须包含两个 相同类型的AttributeValue元素,字符串、数字或 二进制(不是集合类型)。如果目标属性不匹配,则目标属性匹配 值大于或等于第一个元素且小于, 或等于第二个元素。如果项目包含AttributeValue 与请求中提供的元素类型不同的元素 值不匹配。例如,{“S”:“6”}与 {“N”:“6”}。而且,{“N”:“6”}与{“NS”:[“6”、“2”、“1”]}不可比较

这样做的缺点是,对于每个分区键,使用该键的数据不能超过10GB。因此,在一个正方形中可以放置的点的数量是有限的。如果你的正方形足够小,或者你的正方形大小不一,你可以在不太拥挤的区域使用大正方形,在非常拥挤的区域使用小正方形,但这似乎是一个不平凡的项目,那么你可以绕过它

Longtitutede between(x-c, x+c)