在AWS DynamoDB中,您必须指定一个`分区键,这使它像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
,因此BETWEEN
上不允许使用OR
或IN
或partition key
}}
替代query
有scan
但
所以我意识到我可以使用排序键,然后在这种情况下partition key
可以是我的表名,所以我需要更改我的词汇
示例:表 my-api 与partition key -> className
和sort key -> id
my-api
className | id | username | title
_User | 0 | "bingo" |
_User | 1 | "mimi" |
_Song | 0 | | "You with me"
这是奇怪的设计
答案 0 :(得分:2)
如果表中分区键和排序键,按分区键查询,则会为您提供多个项目。
获取API: -
对于复合主键,您必须为两者提供值 分区键和排序键。
因此,Get API将始终只返回一个项目。此外,没有过滤表达式可以按非键属性进行过滤。
答案 1 :(得分:0)
查询是基于主键或索引键属性查找项目。主键可以有一个分区键(哈希键)和一个可选的范围键。如果Range键存在,那么您可以拥有多个具有相同分区键的记录。因此,要对此类复合主键执行GetItem
操作,您需要使用哈希键指定Range键。
此外,您可以指定多个全局二级索引(GSI)和本地二级索引(LSI),通过它们可以查询非关键属性。
因此,查询操作提供了根据主键,LSI或GSI的哈希键和范围键的属性查找项目的方法。
现在,您使用的示例当然不是设计架构的好方法。
表!=数据库
表==表和DynamoDB包含所有表。
User
,Song
等需要存储在不同的表中。然后,您可以指定id
,username
以进一步唯一标识表格中的项目。每个项目都可以被认为是RDBMS中的记录。详细了解如何选择主键和索引以及AWS DynamoDB Developer Guide
答案 2 :(得分:0)
如果没有定义排序键,分区键将始终返回唯一结果。 配置表的排序键意味着分区键和排序键之间的组合必须是唯一的。 有关定义表格结构的最佳实践,请参阅this