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

How to query data in AWS AppSync in a specific range then sort its result by another key?

我在 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=orgIdsortKey=age(最后的名字是orgId-age-index)。 但是接下来,当尝试在 DynamoDB 中查询时,设置 partitionKey orgId=orgId123,sortKey age=[30;50] 并且没有过滤器;然后我可以获得作者列表。但是,无法从上述查询中按 name 对该列表进行排序。

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

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

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

您将无法在单个 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 函数的开销更多。