如何在特定范围内查询AWS AppSync中的数据,然后按另一个键对结果进行排序?

时间:2018-11-09 09:46:39

标签: amazon-web-services amazon-dynamodb aws-appsync

我在AWS DynamoDB中创建具有以下结构的寺庙名称BlogAuthor

authorId | orgId | age |name

稍后我需要进行如下查询:get all authors from organization id = orgId123 with age between 30 and 50, then sort their name in alphabet order

我不确定是否可以在DynamoDB中执行这样的查询(后来我将在AppSync中应用它),因此第一个解决方案是使用partitionKey=orgId,{{1}创建索引(GSI) }(最终名称为sortKey=age)。 但是接下来,当尝试在DynamoDB中进行查询时,请设置partitionKey orgId = orgId123,sortKey age = [30; 50],并且不设置过滤器;然后我可以有一个作者名单。但是,无法从上述查询中按orgId-age-index对列表进行排序。

我通过使用namepartitionKey=orgId创建新索引来重试另一种解决方案。然后,在DynamoDB中使用partitionKey orgId = orgId123查询(不扫描),设置空的sortKey值(因为我们只想按名称排序而不是获取特定名称),并在范围[30; 50]中过滤sortKey=name 。此解决方案似乎可行,但是我注意到该过滤器应用于结果列表-例如,结果列表中包含100个项目,但是按年龄应用过滤器后,可能剩下70个项目,或者什么也没有。但我一直希望它能返回100件商品。

您能告诉我我的方法有什么问题吗?或者,是否可以在DynamoDB中进行这样的查询?

另一个(小)问题是,当将该表连接到AppSync API时:如果无法执行此类查询,那么在AppSync中也无法进行此类查询吗?

1 个答案:

答案 0 :(得分:2)

您将无法在单个DynamoDB查询中完成所需的一切。

选项1:

只要可以在客户端上对对象进行排序,就可以执行所需的操作。这将适用于人数相对较少的组织。

优点:

使您可以有效地查询特定组织中一系列用户之间的用户。

缺点:

结果不在服务器上按名称排序。

选项2:

优点:

允许您按名称排序的组织中的用户进行分页。

缺点:

您无法有效地使组织内的所有用户都达到年龄范围。您将有效地扫描索引,并且需要多次往返呼叫。

选项3:

第三个选择是使用DynamoDB流和AWS Lambda将信息从DynamoDB流到ElasticSearch中。数据放入Elasticsearch后,您可以执行更多高级查询。您可以在https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-body.html上查看有关Elasticsearch搜索API的更多信息。

优点:

功能更强大的查询引擎。

缺点:

带有DynamoDB流和AWS Lambda函数的更多开销。