如何解决Dynamo DB关于表结构的建议
我要存储这样的数据
{ date: '2020-10-06T20:46:01.942Z',topic: 'a great topic',Votes: 123 },{ date: '2020-10-07T23:46:01.942Z',Votes: 125 },{ date: '2020-10-06T20:46:03.942Z',topic: 'a not so great topic',Votes: 12 }
我创建了Dynamo,并将时间戳记作为主键,由于流量低,可以肯定地认为它们将是唯一的。
我希望返回基于主题的数据,以便使用排序键(等于a great topic
)进行发电机查询。
在dyanmo数据库查询语句中使用以下命令时,我不断得到"message": "Query condition missed key schema element"
:
params = {
TableName: table,KeyConditionExpression: "#topic = :topic",ExpressionAttributeNames:{
"#topic": "topic"
},ExpressionAttributeValues: {
":topic": "a great topic"
}
}
这是我的桌子
var tableParams = {
TableName : "a cool table",KeySchema: [
{ AttributeName: "date",KeyType: "HASH"},//Partition key
{
AttributeName: "topic",KeyType: "RANGE"
}
],AttributeDeFinitions: [
{ AttributeName: "date",AttributeType: "S" },{ AttributeName: "topic",AttributeType: "S" }
],ProvisionedThroughput: {
ReadCapacityUnits: 5,WriteCapacityUnits: 5
}
};
我不愿意使用scan,因为即使使用javascript:p
过滤数据会更容易,但这样做很浪费。感谢您的帮助。
解决方法
如果按主题查询,则将主题设置为分区(哈希)键,将时间戳设置为排序(范围)键会更加有效。否则,您始终需要提供特定的时间戳,因为查询始终需要包含分区键。
一个有益的副作用是返回的结果已经按时间戳进行排序。
更新:有关更多详细信息,请参阅上面的赛斯最佳答案!
,您正尝试使用topic
字段查询表,该字段不起作用,因为它是您的排序键。查询DynamoDB时,需要为分区键提供可选的排序键。
让我们快速查看一些术语,以便我们都在同一页面上(来自the docs)。
- 主键-主键唯一地标识表中的每个项目,因此任何两个项目都不能具有相同的键。 有两种不同类型的主键:
- 分区键–一个简单的主键,由一个称为分区键的属性组成。
- 分区键和排序键–称为复合主键,此类型的键由两个属性组成。第一个属性是分区键,第二个属性是排序键
在Dynamodb中执行query
操作时,可以使用KeyConditionExpression
参数为分区键提供特定的值。查询操作将返回具有该分区键值的表或索引中的所有项目。您可以选择在KeyConditionExpression
在查看查询时,您试图通过指定 only 排序键来查询项目,该键将不起作用。我认为您的主键倒退了。您希望分区键为topic
,排序键为date
。
要使您的查询正常工作,请将表的KeySchema
更改为此:
KeySchema: [
{ AttributeName: "topic",KeyType: "HASH"},{ AttributeName: "date",KeyType: "RANGE"}
]
如果这样做,您的query
操作将返回按日期排序的该主题的项目。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。