Dynamodb 我可以用两个 GSI 查询吗?

Posted

技术标签:

【中文标题】Dynamodb 我可以用两个 GSI 查询吗?【英文标题】:Dynamodb can i query with two GSIs? 【发布时间】:2016-05-16 22:36:46 【问题描述】:

感谢您花时间阅读我的问题。

我的情况是这样的。我在 dynamodb 中有一个地理点表。

它包括: object_type(String HASH) id(字符串范围) 纬度(编号 GSI RANGE) lng(编号 GSI 范围)

它有以下索引: object_type-lat-index(object_type-hash lat-range) object_type-lng-index(object_type-hash lng-range)

我想做什么:IndexName: "object_type-lat-index", KeyConditionExpression: "object_type=:otype AND (lat BETWEEN :llat AND :glat) AND (lng BETWEEN :llng AND :glng)", 我希望能够通过获取最小 lat 和更大 lat 以及最小 lng 和更大 lng 之间的关系来查询 lat 和 lng

我似乎无法在 dynamodb 文档中找到它。这可以完成还是我正确地实施它?因为错误返回的内容类似于“只能有 1 或 2 个条件”

【问题讨论】:

【参考方案1】:

http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GSI.html#GSI.Querying

http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScan.html

它的工作方式是查询针对表本身(表中定义的键)或 GSI。您不能在同一个查询中组合多个 GSI 和表 HK。

这里有 2 个选项: 1) 对 2 个索引执行 2 次查询,并在客户端与结果相交 2)对其中一个索引执行一个 1 查询,其中一个带有与另一个表达式一起使用的过滤器表达式(基本上,例如:在 lat 上使用过滤器查询 long)。

【讨论】:

谢谢!我在做选项 2 它会按预期减少读取吞吐量吗?我想问的是,结果的大小(RTU 的消耗)将是应用过滤器之后或应用过滤器之前的结果? 过滤器表达式出现在查询之后——所以不,它不会减少 RTU 消耗。为了更高效,当你创建 GSI 时.. 只关联你需要返回的属性【参考方案2】:

您可以在表中创建一个包含多个属性组合的新属性,并为该新属性创建二级索引,这样您就可以使用 KeyConditionExpression 搜索多个参数。

但如果你需要搜索coinside(包含),这不是办法

【讨论】:

以上是关于Dynamodb 我可以用两个 GSI 查询吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Amplify 库的基于 DynamoDB GSI 的查询

使用 spring-data-dynamodb 在 GSI 中查询 dynamoDB 中的 id 列表

DynamoDB GSI - 仅包含一些行

DynamoDB:查询中的全局二级索引利用率

可以将HASH密钥更新为预先存在的Dynamodb全局二级索引的另一个属性吗?

我们可以更新 DynamoDB 表的现有全局二级索引的投影吗?