GraphQL query with sorting by date
In this guide you will learn how to implement sorting in a GraphQL API. In our example, you will implement sorting results by date in either an ascending or descending order by implementing an additional data access pattern leveraging a DynamoDB Global Secondary Index using the @index
GraphQL Transformer directive.
Overview
To get started, let's start with a basic GraphQL schema for a Todo app:
type Todo @model { id: ID! title: String!}
When the API is created with an @model
directive, the following queries will automatically be created for you:
type Query { getTodo(id: ID!): Todo listTodos( filter: ModelTodoFilterInput limit: Int nextToken: String ): ModelTodoConnection}
Next, take a look at the ModelTodoConnection
type to get an idea of the data that will be returned when the listTodos
query is run:
type ModelTodoConnection { items: [Todo] nextToken: String}
By default, the listTodos
query will return the items
array unordered. Many times you will need these items to be ordered by title, by creation date, or in some other way.
To enable this, you can use the @index directive. This directive will allow you to set a custom sortKey
on any field in your API.
Implementation
In this example, you will enable sorting by the createdAt
field. By default, Amplify will populate this createdAt
field with a timestamp if none is passed in.
To enable this, update your schema with the following:
type Todo @model { id: ID! title: String! type: String! @index( name: "todosByDate" queryField: "todosByDate" sortKeyFields: ["createdAt"] ) createdAt: String!}
Next, create a few todos being sure to populate the type
field:
mutation createTodo { createTodo(input: { title: "Todo 1", type: "Todo" }) { id title }}
Now, you can query for todos by date in an ascending or descending order using the new todosByDate
query:
query todosByDate { todosByDate(type: "Todo", sortDirection: ASC) { items { id title createdAt } }}
query todosByDateDescending { todosByDate(type: "Todo", sortDirection: DESC) { items { id title createdAt } }}
To learn more about the @index
directive, check out the documentation here