【问题标题】:What is the sense of Query in AWS DynamoDBAWS DynamoDB 中的 Query 是什么意思
【发布时间】:2017-06-02 19:33:40
【问题描述】:

在 AWS DynamoDB 中,您必须指定一个 `partition key,这使它像 GetItem 一样工作......因为分区键是唯一的,所以它应该只返回一个项目,所以如果我知道那个项目的 ID,它再查询也没有意义了!因为查询意味着约束......

那么谁能给我一个查询一个分区键可以返回多个项目的例子吗?

# Create single-attribute primary key table
aws dynamodb create-table --table-name testdb6 --attribute-definitions '[{"AttributeName": "Id", "AttributeType": "S"}]' --key-schema '[{"AttributeName": "Id", "KeyType": "HASH"}]' --provisioned-throughput '{"ReadCapacityUnits": 5, "WriteCapacityUnits": 5}' 

# Populate table
aws dynamodb put-item --table-name testdb6 --item '{ "Id": {"S": "1"}, "LastName": {"S": "Lopez"}, "FirstName": {"S": "Maria"}}'
aws dynamodb put-item --table-name testdb6 --item '{ "Id": {"S": "2"}, "LastName": {"S": "Fernandez"}, "FirstName": {"S": "Augusto"}}'

# Query table using only partition attribute
aws dynamodb query --table-name testdb6 --select ALL_ATTRIBUTES --key-conditions '{"Id": {"AttributeValueList": [{"S": "1"}], "ComparisonOperator": "EQ"}}'

您也只能将EQ 运算符用于partition key,因此partition key 上不允许使用例如BETWEENORIN

替代queryscan 但是

  • 扫描成本高(慢)
  • 您无法在扫描时排序

更新

所以我意识到我可以使用排序键,然后在这种情况下partition key 可以是我的表名,所以我需要更改我的词汇表

  • 表格 -> 数据库
  • 分区键 -> 表/集合
  • 排序键 -> 主键/ObjectId

示例:my-apipartition key -> classNamesort key -> id

my-api
   className | id | username | title
   _User     |  0 | "bingo"  |
   _User     |  1 | "mimi"   |
   _Song     |  0 |          | "You with me"

这是一个奇怪的设计

【问题讨论】:

  • 查询用于按分区键以外的列进行过滤,例如按排序键

标签: amazon-web-services amazon-dynamodb


【解决方案1】:

如果表有分区键和排序键并且按分区键查询单独会给你多个项目。

  • 分区键 - 必须使用查询 API
  • 排序键 - 使用查询 API 时可选

获取 API:-

对于复合主键,您必须为两个主键提供值 分区键和排序键。

因此,Get API 将始终只返回一项。此外,没有过滤器表达式可以按非键属性过滤。

【讨论】:

  • 按非键属性过滤 - 您可以使用非键属性作为分区键创建“全局二级索引”。每张桌子限制为 5 gsi。
【解决方案2】:

查询用于根据主键或索引键属性查找项目。主键可以有一个分区键(散列键)和一个可选的范围键。如果 Range 键存在,那么您可以有多个具有相同分区键的记录。所以要对这种复合主键执行GetItem操作,需要指定范围键和哈希键。

另外,您可以指定多个全局二级索引(GSI)和本地二级索引(LSI),通过它们可以查询非关键属性。

因此,查询操作为您提供了根据主键、LSI 或 GS​​I 的哈希键和范围键的属性查找项目的方法。

现在,您使用的示例肯定不是设计架构的好方法。


表!= 数据库

Table == Table 和 DynamoDB 包含所有表。

UserSong 等需要存储在不同的表中。然后您可以指定idusername 以进一步唯一标识您的表中的项目。每个项目都可以被认为是 RDBMS 中的记录。阅读更多关于选择主键和索引的信息以及来自AWS DynamoDB Developer Guide的所有信息

【讨论】:

  • 告诉我如何在不知道用户 ID 或用户名的情况下通过电子邮件查询用户将只与 1 个用户关联?
  • 是的,每个 id 都会与一个用户相关联。或者,如果您的每个用户将始终拥有唯一的 username,那么您可以指定 username 作为分区键。但这是您的偏好,对于通过电子邮件查询,您可以指定email作为全局二级索引的哈希键,这将允许您通过email查询用户。
【解决方案3】:

如果没有定义排序键,分区键将始终返回唯一结果。 为您的表配置排序键意味着分区键和排序键之间的组合必须是唯一的。 有关定义表结构的最佳实践,请参阅this

【讨论】:

    猜你喜欢
    • 2020-11-10
    • 2019-01-02
    • 2022-01-22
    • 1970-01-01
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多