【发布时间】:2017-11-27 22:53:02
【问题描述】:
我是 AWS DynamoDB 的新手,想澄清一些事情。是否可以根据非主键属性查询表和过滤器。我的表如下所示
商店 标识:主键 名称:简单字符串 位置:简单字符串
现在我想查询名称,但我想我也必须根据我所知道的提供密钥?除此之外,我可以使用扫描,但随后我将加载所有数据。
【问题讨论】:
标签: amazon-dynamodb
我是 AWS DynamoDB 的新手,想澄清一些事情。是否可以根据非主键属性查询表和过滤器。我的表如下所示
商店 标识:主键 名称:简单字符串 位置:简单字符串
现在我想查询名称,但我想我也必须根据我所知道的提供密钥?除此之外,我可以使用扫描,但随后我将加载所有数据。
【问题讨论】:
标签: amazon-dynamodb
来自docs:
查询操作根据主键值查找项目。您可以查询具有复合主键(分区键和排序键)的任何表或二级索引。
DynamoDB 要求查询始终使用分区键。
在您的情况下,您的选择是:
【讨论】:
KeyConditionExpression 不是放置条件的正确位置。而是查看 FilterExpression:docs.aws.amazon.com/amazondynamodb/latest/developerguide/…
在使用 DynamoDB 时,您可以遵循的设计原则很少。如果您来自关系背景,那么您已经见证了主键属性的查询限制。
使用全局二级索引,您可以将任何非键属性提升为索引的分区键,并为排序键选择另一个属性进行查询。对于本地二级索引,您可以将任何非键属性提升为保持相同分区键的排序键。
假设您有一个包含 40KB 项目的 DynamoDB 表。如果直接从表中读取列出 10 个项目,它会消耗 100 个读取吞吐量单元(对于一个项目 10 个单元,因为一个单元可以读取 4KB 并乘以 10)。如果您定义的索引只是为了投影需要列出的属性,每个项目将具有 4KB,那么它将仅消耗 10 个读取吞吐量单位(每个项目一个单位),这会在成本方面产生巨大差异。
【讨论】:
您不能在 Dynamo Db 中查询基于非主键的属性。
如果您仍然想这样做,您可以使用扫描查询来完成,但扫描在 DyanmoDB 中是昂贵的操作,如果表很大,那么它会影响性能,不推荐,因为它会扫描表中的每个项目和 AWS 成本您为该查询扫描的所有项目。
有两种实现方式
在 Dyanamo DB 中创建 GSI 有 3 种方法,在您的情况下,选择带有选项 INCLUDE 的 GSI 并在 Idex 中添加 Name 、 Location 和 store ID。
KEYS_ONLY – 索引中的每个项目仅由表分区键和排序键值以及索引键值组成。 KEYS_ONLY 选项会产生最小的二级索引。
INCLUDE – 除了 KEYS_ONLY 中描述的属性外,二级索引还将包括您指定的其他非键属性。
【讨论】: