使用全局二级索引的 DynamoDB 表查询项
Posted
技术标签:
【中文标题】使用全局二级索引的 DynamoDB 表查询项【英文标题】:DynamoDB Table query items using global secondary index 【发布时间】:2017-05-13 22:01:21 【问题描述】:我正在尝试查询具有不同位置的纬度和经度的发电机表。当用户在地图上平移时,我想获取某些坐标之间的值。
表的主键是city
,排序键是id
。我创建了一个全局二级索引,其中lat
作为分区键,lon
作为排序键(用于查询经纬度两点之间的位置)。
我正在尝试使用此查询:
let doc = require('dynamodb-doc');
let dynamo = new doc.DynamoDB();
...
var params =
TableName : "locations-dev",
IndexName: "lat-lon-index",
KeyConditionExpression: "lon between :lon2 and :lon1 AND lat between :lat1 and :lat2",
ExpressionAttributeValues:
":lat1": JSON.stringify(event.bodyJSON.east),
":lat2": JSON.stringify(event.bodyJSON.west),
":lon1": JSON.stringify(event.bodyJSON.north),
":lon2": JSON.stringify(event.bodyJSON.south)
;
dynamo.query(params, function (err, data)
if (err)
console.error('Error with ', err);
context.fail(err);
else
context.succeed(data);
);
但我收到此错误:
"errorMessage": "Query key condition not supported",
"errorType": "ValidationException",
"stackTrace": [
...
]
这是 Dynamo 中的示例项目:
"id": "18",
"lat": "39.923070",
"lon": "-86.036178",
"name": "Home Depot",
"phone": "(317)915-8534",
"website": "https://corporate.homedepot.com/newsroom/battery-recycling-one-million-pounds"
【问题讨论】:
【参考方案1】:DynamoDB 中的主键(即使在二级索引中)只能使用等于条件进行查询。此约束源自其内部表示,因为它存储为散列值以标识其项目分区。这些哈希值不能按范围查询。
Choosing the Right DynamoDB Partition Key
除了扫描之外,DynamoDB API 操作需要一个相等的运算符 (EQ) 用于表和 GSI 的分区键。结果, 分区键必须是您可以轻松查询的内容 具有简单查找的应用程序(例如,使用 key=value, 返回唯一项或更少项)。
【讨论】:
谢谢;我以为我看到人们使用between
运算符。我想我将不得不使用 SQL 来实现我想要的。以上是关于使用全局二级索引的 DynamoDB 表查询项的主要内容,如果未能解决你的问题,请参考以下文章
如何在无服务器框架中使用全局二级索引定义 DynamoDB 表
并行执行DynamoDB查询(全局二级索引的BatchGetItems)
.net 通过 DynamoDBContext 查询 DynamoDB 中的全局二级索引