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 列表