Поделиться через


Упорядочивание результатов в GraphQL (orderBy)

Порядок определяет последовательность возвращаемых записей и поддерживает стабильную разбивку на страницы. В GraphQL построитель API данных (DAB) использует orderBy аргумент для сортировки результатов перед применением first или after. Если не указано orderBy, DAB по умолчанию выполняет сортировку по первичному ключу (возрастанию).

Замечание

Составные первичные ключи упорядочены по последовательности столбцов базы данных.

Перейдите к версии REST этого документа.

Обзор

Понятие Description
Аргумент orderBy
Значения направления ASC, DESC
Порядок по умолчанию Возрастание первичного ключа
Порядок нескольких полей Упорядочено объявленным порядком свойств объекта
Тай-брейк Остальные поля первичного ключа добавляются автоматически

Шаблон использования

query {
  books(orderBy: { year: DESC, title: ASC }, first: 5) {
    items {
      id
      title
      year
    }
  }
}

Концептуальный SQL

SELECT TOP (5)
  id,
  sku_title AS title,
  year
FROM dbo.books
ORDER BY year DESC, sku_title ASC, id ASC;

Пример ответа

{
  "data": {
    "books": {
      "items": [
        { "id": 7, "title": "Dune Messiah", "year": 1969 },
        { "id": 6, "title": "Dune", "year": 1965 },
        { "id": 3, "title": "Foundation", "year": 1951 },
        { "id": 1, "title": "I, Robot", "year": 1950 },
        { "id": 8, "title": "The Martian Chronicles", "year": 1950 }
      ]
    }
  }
}

Поведение полей

Аспект Поведение
Тип входных данных Созданное перечисление *OrderByInput скалярных полей
Перечисление направления ASC, DESC
Составной порядок Приоритет следует за порядком объявления
Направление NULL Исключает поле из сортировки (title: null)
Неизвестное поле Создает ошибку проверки GraphQL

Пример пропуска поля

query {
  books(orderBy: { title: null, id: DESC }) {
    items { id title }
  }
}

Недопустимые структуры

GraphQL запрещает логические операторы (and, orвнутри orderBy). Например, в следующем случае возникает ошибка проверки:

books(orderBy: { or: { id: ASC } })

Пример использования переменной

query ($dir: OrderBy) {
  books(orderBy: { id: $dir }, first: 4) {
    items { id title }
  }
}

Variables

{ "dir": "DESC" }

Соответствующая конфигурация

{
  "entities": {
    "Book": {
      "source": {
        "object": "dbo.books",
        "type": "table"
      },
      "mappings": {
        "sku_title": "title"
      }
    }
  }
}

Пример конфигурации

{
  "runtime": {
    "pagination": {
      "default-page-size": 100,
      "max-page-size": 100000
    }
  },
  "entities": {
    "Book": {
      "source": {
        "type": "table",
        "object": "dbo.books"
      },
      "mappings": {
        "sku_title": "title",
        "sku_price": "price"
      },
      "relationships": {
        "book_category": {
          "cardinality": "one",
          "target.entity": "Category",
          "source.fields": [ "category_id" ],
          "target.fields": [ "id" ]
        }
      }
    },
    "Category": {
      "source": {
        "type": "table",
        "object": "dbo.categories"
      },
      "relationships": {
        "category_books": {
          "cardinality": "many",
          "target.entity": "Book",
          "source.fields": [ "id" ],
          "target.fields": [ "category_id" ]
        }
      }
    }
  }
}

См. также

Понятие REST GraphQL Цель
Projection $select items Выбор возвращаемых полей
Filtering $filter фильтр Ограничение строк по условию
Сортировка $orderby orderBy Определение порядка сортировки
Размер страницы $first first Ограничение количества элементов на страницу
Продолжение $after после Продолжить с последней страницы с помощью курсора

Замечание

Ключевые слова REST начинаются с $следующих соглашений OData.