在 AWS Amplify GraphQL 中对结果进行排序而不进行过滤
Posted
技术标签:
【中文标题】在 AWS Amplify GraphQL 中对结果进行排序而不进行过滤【英文标题】:Sorting results in AWS Amplify GraphQL without filtering 【发布时间】:2020-11-02 03:37:55 【问题描述】:在graphql.schema
中提供了一个非常简单的模型,我将如何执行一个简单的排序查询?
type Todo @model
id: ID!
text: String!
在queries.js
中生成以下内容。
export const listTodos = /* GraphQL */ `
query ListTodos(
$filter: ModelTodoFilterInput
$limit: Int
$nextToken: String
)
listTodos(filter: $filter, limit: $limit, nextToken: $nextToken)
items
id
text
nextToken
`;
我发现多个来源指向@key
directive 的方向。这个类似的问题解决了这种方法 (GraphQL with AWS Amplify - how to enable sorting on query)。
虽然这看起来很有希望并且成功地生成了我可以使用的新查询,但我尝试过的所有方法都要求我在对数据进行排序之前对其进行过滤。我想要做的就是按照给定的列名和给定的排序方向 (ASC/DESC) 对我的待办事项结果进行排序。
这就是我执行简单(未排序)查询的方式:
const todos = await API.graphql(graphqlOperation(listTodos));
我希望按照以下方式做一些事情:
const todos = await API.graphql(graphqlOperation(listTodos, sortField: "text", sortDirection: "ASC" ))
.
【问题讨论】:
【参考方案1】:我接受了 Mtran 的回答,因为我觉得它是最接近实际解决方案的事情,但我也决定实际选择一种解决方法。这样,我就避免了向 ElasticSearch 添加依赖项。
我最终将一个字段添加到我的架构中,并且每个条目都具有该字段的相同值。这样,我可以按该值进行过滤,并且仍然拥有整个值表,然后我可以对其进行排序。
【讨论】:
【参考方案2】:使用@searchable
指令装饰您的模型,如下所示:
type Todo @model @searchable
id: ID!
text: String!
之后,您可以使用如下排序功能查询您的数据:
import searchToDos from '../graphql/queries';
import API, graphqlOperation from 'aws-amplify';
const toDoData = await API.graphql(graphqlOperation(searchToDos,
sort:
direction: 'asc',
field: 'text'
));
console.log(toDoData.data.searchToDos.items);
有关详细信息,请参阅
https://github.com/aws-amplify/amplify-cli/issues/1851#issuecomment-545245633 https://docs.amplify.aws/cli/graphql-transformer/directives#searchable【讨论】:
这是否需要额外依赖 AWS Elasticsearch(以及额外的服务器成本?) 是的,这是我在撰写本文时能找到的唯一方法(没有过滤)。如果您考虑到 ElasticSearch 提供的灵活性和性能优于普通数据库搜索查询,那么使用 AWS Elasticsearch 可能是值得的。看看这篇文章:aws.amazon.com/blogs/startups/… 另一种选择是您可以进行客户端排序,但这仅对小型数据集有效。以上是关于在 AWS Amplify GraphQL 中对结果进行排序而不进行过滤的主要内容,如果未能解决你的问题,请参考以下文章
使用 AWS Amplify/AppSync 的嵌套 GraphQL 突变
aws amplify appsync 中的 Graphql 突变错误
AWS Amplify GraphQL Schema 导致错误
AWS Amplify (GraphQL) - 使用“graphqlOperation”与普通查询?