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

Ian*_*res 5 graphql aws-amplify

中提供了一个非常简单的模型graphql.schema,我将如何执行简单的排序查询?

type Todo @model
  id: ID!
  text: String!
}
Run Code Online (Sandbox Code Playgroud)

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
    }
  }
`;
Run Code Online (Sandbox Code Playgroud)

我发现多个消息来源将我指向@key 指令的方向。这个类似的问题解决了这种方法(GraphQL with AWS Amplify - how to enable sort on query)。

虽然这看起来很有希望并且成功地生成了我可以使用的新查询,但我尝试过的所有方法都要求我在对数据进行排序之前对其进行过滤。我想要做的就是在给定的列名上对我的待办事项结果进行排序,并使用给定的排序方向(ASC/DESC)。

这是我执行简单(未排序)查询的方式: const todos = await API.graphql(graphqlOperation(listTodos));

我会希望做线沿线的东西: const todos = await API.graphql(graphqlOperation(listTodos, {sortField: "text", sortDirection: "ASC"} ))

MTr*_*ran 7

使用@searchable指令装饰您的模型,如下所示:

type Todo @model @searchable
{
  id: ID!
  text: String!
}
Run Code Online (Sandbox Code Playgroud)

之后,您可以使用排序功能查询数据,如下所示:

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);
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅


小智 4

@searchable如果您只需要直接排序,则声明会产生毫无意义的额外服务器成本。它配备了一个 EBS 和一个 OpenSearch,每月费用至少约为 20 美元。

相反,您需要使用该@index指令。

根据此处的文档:https ://docs.amplify.aws/guides/api-graphql/query-with-sorting/q/platform/js/

在您的模型中,将@index指令添加到带有几个参数的字段之一:

type Todo @model {
  id: ID!
  title: String!
  type: String! @index(name: "todosByDate", queryField: "todosByDate", sortKeyFields: ["createdAt"])
  createdAt: String!
}
Run Code Online (Sandbox Code Playgroud)

通过声明queryField和 ,sortKeyField一旦您推送放大配置,您现在将拥有一个可用的新查询:

query todosByDate {
  todosByDate(
    type: "Todo"
    sortDirection: ASC
  ) {
    items {
      id
      title
      createdAt
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

您声明此指令的字段不能为空(请注意字段名称后面的 !)

与 相比,这是一种更好的方法@searchable,后者的杀伤力太大了​​。