在不过滤的情况下对 AWS Amplify GraphQL 中的结果进行排序

Sorting results in AWS Amplify GraphQL without filtering

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. This similar question addresses that approach ()。

虽然这看起来很有希望并且成功地生成了我可以使用的新查询,但我尝试过的所有方法都要求我在排序之前过滤数据。我想要做的就是按照给定的排序方向 (ASC/DESC).

在给定的列名上对我的待办事项结果进行排序

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

我希望按照以下方式做一些事情: const todos = await API.graphql(graphqlOperation(listTodos, {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 添加依赖项。

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