graphql-engine/docs/graphql/manual/queries/sorting.rst
2019-04-19 16:18:18 +05:30

423 lines
9.0 KiB
ReStructuredText

Sort query results
==================
.. contents:: Table of contents
:backlinks: none
:depth: 1
:local:
Results from your query can be sorted by using the ``order_by`` argument. The argument can be used to sort nested
objects too.
The sort order (ascending vs. descending) is set by specifying ``asc`` or ``desc``
enum value for the column name in the ``order_by`` input object e.g. ``{name: desc}``.
By default, for ascending ordering ``null`` values are returned at the end of the results and for descending
ordering ``null`` values are returned at the start of the results. ``null`` values can be fetched first on
ascending ordering by specifying ``asc_nulls_first`` and last on descending ordering by specifying
``desc_nulls_last`` enum value e.g. ``{name: desc_nulls_last}``.
The ``order_by`` argument takes an array of objects to allow sorting by multiple columns.
You can also use nested objects' fields to sort the results. Only **columns from object relationships** and
**aggregates from array relationships** can be used for sorting.
You can see the complete specification of the ``order_by`` argument in the :ref:`API reference <OrderByExp>`.
The following are example queries for different sorting use cases:
Sorting objects
---------------
**Example:** Fetch list of authors sorted by their names in an ascending order:
.. graphiql::
:view_only:
:query:
query {
author (
order_by: {name: asc}
) {
id
name
}
}
:response:
{
"data": {
"author": [
{
"id": 5,
"name": "Amii"
},
{
"id": 4,
"name": "Anjela"
},
{
"id": 8,
"name": "April"
},
{
"id": 2,
"name": "Beltran"
},
{
"id": 7,
"name": "Berti"
},
{
"id": 6,
"name": "Corny"
}
]
}
}
.. _nested_sort:
Sorting nested objects
----------------------
**Example:** Fetch a list of authors sorted by their names with a list of their articles that is sorted by
their rating:
.. graphiql::
:view_only:
:query:
query {
author (order_by: {name: asc}) {
id
name
articles(order_by: {rating: desc}) {
id
title
rating
}
}
}
:response:
{
"data": {
"author": [
{
"id": 5,
"name": "Amii",
"articles": [
{
"rating": 5,
"id": 17,
"title": "montes nascetur ridiculus"
},
{
"rating": 3,
"id": 12,
"title": "volutpat quam pede"
},
{
"rating": 2,
"id": 4,
"title": "vestibulum ac est"
}
]
},
{
"id": 4,
"name": "Anjela",
"articles": [
{
"rating": 4,
"id": 3,
"title": "amet justo morbi"
},
{
"rating": 1,
"id": 1,
"title": "sit amet"
}
]
},
{
"id": 8,
"name": "April",
"articles": [
{
"rating": 4,
"id": 13,
"title": "vulputate elementum"
},
{
"rating": 2,
"id": 20,
"title": "eu nibh"
}
]
}
]
}
}
Sorting based on nested object's fields
---------------------------------------
Only **columns from object relationships** and **aggregates from array relationships** can be used for sorting.
For Object relationships
^^^^^^^^^^^^^^^^^^^^^^^^
For object relationships only columns can be used for sorting.
**Example:** Fetch a list of articles that are sorted by their author's ids in descending:
.. graphiql::
:view_only:
:query:
query {
article (
order_by: {author: {id: desc}}
) {
id
rating
published_on
author {
id
name
}
}
}
:response:
{
"data": {
"article": [
{
"id": 3,
"title": "Article 3",
"content": "Sample article content 3",
"author": {
"id": 2,
"name": "Author 2"
}
},
{
"id": 1,
"title": "Article 1",
"content": "Sample article content 1",
"author": {
"id": 1,
"name": "Author 1"
}
},
{
"id": 2,
"title": "Article 2",
"content": "Sample article content 2",
"author": {
"id": 1,
"name": "Author 1"
}
}
]
}
}
For Array relationships
^^^^^^^^^^^^^^^^^^^^^^^
For array relationships only aggregates can be used for sorting.
**Example:** Fetch a list of authors sorted in descending order of their article count:
.. graphiql::
:view_only:
:query:
query {
author (
order_by: {
articles_aggregate: {count: desc}
}
) {
id
name
articles_aggregate {
aggregate{
count
}
}
}
}
:response:
{
"data": {
"author": [
{
"id": 5,
"name": "Amii",
"articles_aggregate":{
"aggregate": {
"count": 3
}
}
},
{
"id": 4,
"name": "Anjela",
"articles_aggregate":{
"aggregate": {
"count": 2
}
}
},
{
"id": 8,
"name": "April",
"articles_aggregate":{
"aggregate": {
"count": 2
}
}
}
]
}
}
**Example:** Fetch a list of authors sorted in increasing order of their highest article rating:
.. graphiql::
:view_only:
:query:
query {
author(
order_by: {
articles_aggregate: {
max: {rating: asc_nulls_last}
}
}
) {
id
name
articles_aggregate {
aggregate{
max {rating}
}
}
}
}
:response:
{
"data": {
"author": [
{
"id": 7,
"name": "Berti",
"articles_aggregate": {
"aggregate": {
"max": {
"rating": 2
}
}
}
},
{
"id": 2,
"name": "Beltran",
"articles_aggregate": {
"aggregate": {
"max": {
"rating": 3
}
}
}
},
{
"id": 8,
"name": "April",
"articles_aggregate": {
"aggregate": {
"max": {
"rating": 4
}
}
}
},
{
"id": 3,
"name": "Sidney",
"articles_aggregate": {
"aggregate": {
"max": {
"rating": 4
}
}
}
},
{
"id": 5,
"name": "Amii",
"articles_aggregate": {
"aggregate": {
"max": {
"rating": 5
}
}
}
},
{
"id": 9,
"name": "Ninnetta",
"articles_aggregate": {
"aggregate": {
"max": {
"rating": null
}
}
}
}
]
}
}
Sorting by multiple fields
--------------------------
**Example:** Fetch a list of articles that is sorted by their rating (descending) and then on their published
date (ascending with nulls first):
.. graphiql::
:view_only:
:query:
query {
article (
order_by: [
{rating: desc},
{published_on: asc_nulls_first}
]
) {
id
rating
published_on
}
}
:response:
{
"data": {
"article": [
{
"id": 17,
"rating": 5,
"published_on": null
},
{
"id": 14,
"rating": 4,
"published_on": null
},
{
"id": 7,
"rating": 4,
"published_on": "2016-07-09"
},
{
"id": 3,
"rating": 4,
"published_on": "2017-05-26"
}
]
}
}