Amazon dynamodb 基于非主键的AWS DynamoDB查询

Amazon dynamodb 基于非主键的AWS DynamoDB查询,amazon-dynamodb,Amazon Dynamodb,我是AWS DynamoDB的新手,想澄清一些事情。是否可以基于非主键属性查询表和筛选器。我的桌子如下所示 贮藏 Id:PrimaryKey 名称:简单字符串 位置:简单字符串 现在我想询问一下这个名字,但我想我也必须给出我所知道的钥匙?除此之外,我可以使用扫描,但随后我将加载所有数据。从: 查询操作根据主键值查找项目。您可以查询具有复合主键(分区键和排序键)的任何表或辅助索引 DynamoDB要求查询始终使用分区键 在您的情况下,您的选择是: 创建使用名称作为主键的全局辅助索引 如果表相对较

我是AWS DynamoDB的新手,想澄清一些事情。是否可以基于非主键属性查询表和筛选器。我的桌子如下所示

贮藏 Id:PrimaryKey 名称:简单字符串 位置:简单字符串

现在我想询问一下这个名字,但我想我也必须给出我所知道的钥匙?除此之外,我可以使用扫描,但随后我将加载所有数据。

从:

查询操作根据主键值查找项目。您可以查询具有复合主键(分区键和排序键)的任何表或辅助索引

DynamoDB要求查询始终使用分区键

在您的情况下,您的选择是:

  • 创建使用名称作为主键的全局辅助索引
  • 如果表相对较小,或者您希望结果集包含表中的大多数记录,请使用“扫描+筛选”

在使用DynamoDB时,可以遵循的设计原则很少。如果您来自关系背景,那么您已经看到了主键属性的查询限制

  • 设计表,用于查询和分离热数据和冷数据
  • 创建用于从非键属性查询的索引(您有两个选项,可以随时定义全局二级索引和需要在表创建时指定的本地二级索引)
使用全局二级索引,您可以将任何非键属性提升为索引的分区键,并为排序键选择另一个属性进行查询。对于本地二级索引,可以将任何非键属性提升为排序键,并保持相同的分区键

  • 使用索引进行查询对于提高使用供应吞吐量的效率也很重要
  • 尽管使用索引会消耗表的读取吞吐量,但它也会以某种方式节省从的读取吞吐量,如果您投射了正确数量的属性进行读取,那么它可以在读取中提供巨大的好处。检查以下示例
假设您有一个DynamoDB表,其中包含40KB的项。如果直接从表中读取以列出10项,则会消耗100个读取吞吐量单位(对于一项,为10个单位,因为一个单位可以读取4KB并将其乘以10)。如果您定义了一个索引,只是为了投影列表所需的属性,每个项将有4KB的容量,那么它将只消耗10个读取吞吐量单元(每个项一个单元),这在成本方面会产生巨大的差异

  • 使用DynamoDB,您如何定义索引以优化查询,这一点非常重要,不仅从查询能力方面,而且从吞吐量方面

您不能在Dynamo Db中查询基于非主键的属性

若您仍想这样做,可以使用扫描查询进行,但在DyanmoDB中,扫描操作成本很高,若表很大,那个么它将影响性能,不推荐这样做,因为它将扫描表中的每个项目,AWS将为您扫描该查询的所有项目

有两种方法可以实现它

  • 将Store Id保留为Dyanmo DB表的PrimaryKey/Partaion键,并将Name/Location添加为排序键(只有一个作为Dyanmo DB,设计时只接受一个属性作为排序键)
  • 创建全局二级索引,用于从非关键属性进行查询,这是您经常需要的
  • 有3种方法可以在Dyanamo DB中创建GSI,在您的情况下,选择GSI,并在Idex中添加名称、位置和存储ID选项

    • KEYS_ONLY–索引中的每个项仅由表分区键和排序键值以及索引键值组成。KEYS_ONLY选项产生最小的二级索引

    • INCLUDE–除了KEYS_中描述的属性外,次要索引还将包括您指定的其他非关键属性

    • ALL–辅助索引包括源表中的所有属性。由于所有表数据在索引中都是重复的,所以ALL投影会产生最大的辅助索引

    名称可以重复,唯一的是ID或名称+位置。GSIs可能包含重复的键感谢这一点并将我指向正确的方向,我在名称上创建了一个GSI,但遇到了另一个问题,我想使用contains进行筛选,但据我所知,KeyConditionExpression不允许我这样做,是否有更好的方法来是否完成此操作?我的场景是,用户键入一个storename,我希望使用contains进行筛选,最好忽略Case。我不确定我是否理解正确,但如果您希望进一步筛选查询返回的结果,则
    KeyConditionExpression
    不是放置条件的正确位置。相反,请查看FilterExpression:然而,如果你想要的是一种在键本身上进行通配符匹配的查询方法,那么答案是,不幸的是,DynamoDB不支持这种类型的操作。在这种情况下,你必须重新考虑DynamoDB。也许基于ElasticSearch的解决方案可能更好。我只是不明白这是怎么回事流行。开始工作是一件非常痛苦的事情,更不用说数据查询的设置和维护是荒谬的,并且不允许像SUM或COUNT这样的聚合。老实说,这比它的价值更麻烦,95%的功能可以通过在关系数据库中的表上使用连接来复制。我的意思是什么Database要求您告诉它应该在解析器中返回什么??我已经告诉过您我在查询中想要什么!