如何在特定范围内查询 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=orgId
、sortKey=age
(最后的名字是orgId-age-index
)。
但是接下来,当尝试在 DynamoDB 中查询时,设置 partitionKey orgId=orgId123,sortKey age=[30;50] 并且没有过滤器;然后我可以获得作者列表。但是,无法从上述查询中按 name
对该列表进行排序。
我通过使用 partitionKey=orgId
和 sortKey=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 函数的开销更多。
我在 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
、sortKey=age
(最后的名字是orgId-age-index
)。
但是接下来,当尝试在 DynamoDB 中查询时,设置 partitionKey orgId=orgId123,sortKey age=[30;50] 并且没有过滤器;然后我可以获得作者列表。但是,无法从上述查询中按 name
对该列表进行排序。
我通过使用 partitionKey=orgId
和 sortKey=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 函数的开销更多。