使用多个属性

时间:2018-03-08 16:18:47

标签: amazon-web-services aws-lambda amazon-dynamodb alexa-skills-kit

我在这个网站上的一些人的帮助下创造了一项技能。

我有一个数据库,我想要做的是让Alexa从我的数据库中调用数据。即通过要求某个日期的电影

我现在遇到的问题是我已经定义了我的分区键,它对我表中的一个项目正常工作,并会读取该特定键的消息,但我搜索的其他任何内容都给了我同样的响应作为一个有效的项目。关于如何克服这个问题的任何想法?

以下是我如何定义我的表格:

let handleCinemaIntent = (context, callback) => {    
  let params = {
    TableName: "cinema",
    Key: {
        date: "2018-01-04",
    }
  };

正如旁注,我将在分区键中重复相同的日期,根据我的理解,分区键必须是唯一的;所以我需要克服这一点。

1 个答案:

答案 0 :(得分:2)

您可以使用几种方法来构建DynamoDB表,但我认为最直接的选择如下:

您可以使用" date"的分区键设置您的表格。 (就像你现在一样),但也有sort key,这将是电影名称,或其他一些标识符。这样,您可以将特定日期的所有影片放在一个分区键下,并使用Query操作查询它们(与您一直使用的GetItem相反)。您无法修改现有表以添加排序键,因此您必须删除现有表并使用不同的模式重新创建它。

由于每天的电影数量通常相当有限,这个分区方案应该可以很好地工作,假设你总是只是白天查询。如果您需要仅通过电影名称进行搜索(例如,"给我这部电影的运行日期")。如果您需要后者,那么您可以创建一个GSI,其中主键是电影名称,范围键是日期。

但是,您应该暂停一下,考虑DynamoDB是否适合您的需求。我这样说是因为Dynamo非常擅长访问模式,你可以确切地知道你在搜索什么,你需要能够横向扩展。而您的用例更像是模糊搜索。

作为Dynamo的替代方案,您可以考虑设置ElasticSearch集群并将影片数据投入其中。然后,您可以非常轻松地运行像#34这样的查询;这些电影将在这一天运行什么?#34;这部电影将在什么日子运行?#34;或者#34;本周将播放哪些电影&#34 34;或者"今年春天会有什么动作电影","今天正在播放什么动画电影","什么电影在我附近播放"