使用全局二级索引的 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 中的全局二级索引

使用二级索引改进数据访问DynamoDB

使用aws cli将全局二级索引添加到DynamoDB中的现有表

扫描Dynamo DB中的特定行