在AWS Amplify GraphQL中对结果排序而不进行过滤

时间:2020-07-12 23:30:15

标签: graphql aws-amplify

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"} ))

2 个答案:

答案 0 :(得分:1)

使用@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);

有关更多信息,请参见

答案 1 :(得分:0)

我接受了MTran的回答,因为在我看来,这是最接近实际解决方案的事情,但我还决定实际上选择一种解决方法。这样,我避免将依赖项添加到ElasticSearch。

我最终在我的架构中添加了一个字段,并且每个单独的条目对该字段都具有相同的值。这样,我可以按该值进行过滤,但仍然拥有整个值表,然后可以对其进行排序。