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

中指定排序键值和比较运算符来缩小Query操作的范围

在查看查询时,您试图通过指定 only 排序键来查询项目,该键将不起作用。我认为您的主键倒退了。您希望分区键为topic,排序键为date

要使您的查询正常工作,请将表的KeySchema更改为此:

    KeySchema: [       
        { AttributeName: "topic",KeyType: "HASH"},{ AttributeName: "date",KeyType: "RANGE"}
    ]

如果这样做,您的query操作将返回按日期排序的该主题的项目。