Graphql AWS放大图中的排序结果无需过滤
在Graphql AWS放大图中的排序结果无需过滤,graphql,aws-amplify,Graphql,Aws Amplify,在graphql.schema中提供了一个非常简单的模型,如何执行简单的排序查询 type Todo @model id: ID! text: String! } 它在querys.js中生成以下内容 export const listTodos = /* GraphQL */ ` query ListTodos( $filter: ModelTodoFilterInput $limit: Int $nextToken: String ) { l
graphql.schema
中提供了一个非常简单的模型,如何执行简单的排序查询
type Todo @model
id: ID!
text: String!
}
它在querys.js
中生成以下内容
export const listTodos = /* GraphQL */ `
query ListTodos(
$filter: ModelTodoFilterInput
$limit: Int
$nextToken: String
) {
listTodos(filter: $filter, limit: $limit, nextToken: $nextToken) {
items {
id
text
}
nextToken
}
}
`;
我找到了多个指向@键方向的源。这个类似的问题解决了这个方法()
虽然这看起来很有希望,并且成功地生成了我可以使用的新查询,但我尝试过的所有方法都要求我在对数据进行排序之前过滤数据。我所要做的就是根据给定的列名和给定的排序方向(ASC/DESC)对todo结果进行排序
这是我执行简单(未排序)查询的方式:
const todos=await API.graphql(graphql操作(listtoos))代码>
我希望按照以下思路做一些事情:
const-todos=wait-API.graphql(graphqlooperation(listtoos,{sortField:“text”,sortDirection:“ASC”}))
用@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);
有关详细信息,请参阅
我接受了MTran的答案,因为我觉得这是最接近实际解决方案的解决方案,但我也决定实际选择解决方案。这样,我就避免了向ElasticSearch添加依赖项
最后,我在模式中添加了一个字段,每个条目对该字段都有相同的值。这样,我就可以根据该值进行筛选,并且仍然拥有整个值表,我可以对其进行排序。这难道不需要对AWS Elasticsearch进行额外的依赖性(以及额外的服务器成本?)是的,这是我在撰写本文时能找到的唯一方法(没有筛选)。使用AWS弹性搜索可能是值得的,如果您考虑的灵活性和性能弹性搜索提供正常的DB搜索查询。查看本文:另一种选择是,您可以进行客户端排序,但这只适用于小型数据集。