Как отсортировать результаты запроса с помощью GraphQL и AWS AppSync

Предполагается, что вы имеете общее представление о GraphQL, AppSync и DynamoDB.

Бэкэнд GraphQL, используемый в AWS AppSync, чаще всего подключается к DynamoDB, базе данных NoSQL. Если вы здесь, то знаете, что база данных NoSQL не предоставляет упорядоченных результатов при выполнении запроса.

Выполнение одного и того же запроса несколько раз к таблице DynamoDB может привести к разному набору или порядку результатов в каждом ответе. Мы можем решить эту проблему с помощью глобального вторичного индекса и ключа сортировки.

Желаемый результат

Каждый раз, когда вы запускаете новый запрос, он возвращает объекты в порядке dueDate, от самого последнего до самого последнего, из вашей таблицы.

В этом примере мы используем dueDate, но вы можете изменить его на все, что требуется для вашей схемы.

Реализация

Нам нужно создать новый индекс (глобальный вторичный индекс) для таблицы, которую мы хотим запросить. AppSync имеет для этого встроенные функции.

Наша исходная модель выглядит так:

type Homework @model
{
  id: ID!
  dueDate: AWSDateTime!
  homeworkStudentId: String!
}

Нам нужно изменить его на это:

type Homework @model
@key(
  name: "byDueDate"
  fields: ["homeworkStudentId", "dueDate"]
  queryField: "homeworkByDueDate"
)
{
  id: ID!
  dueDate: AWSDateTime!
  homeworkStudentId: String
}

Обратите особое внимание на ключевые поля:

fields: ["homeworkStudentId", "dueDate"]

Первое поле - это хеш-ключ, и оно обязательно. Второе поле не требуется, если вы просто хотите запросить homeworkStudentId, но необходимо, если вы хотите, чтобы результаты были отсортированы за вас. Фактически в заявлении говорится:

Дайте мне все домашние задания с указанным мной homeworkStudentId и отсортируйте результаты по dueDate.

Запустите ampify push, чтобы внести изменения в облако и активировать индекс.

Использование индекса

После завершения обновления AppSync ваш индекс готов к использованию. Вы можете подтвердить его выполнение, перейдя в консоль AWS = ›DynamoDB =› HomeworkTable = ›Indexes. Вы должны увидеть новый индекс с именем «byDueDate».

Эта команда создаст глобальный вторичный индекс с хеш-ключом homeworkStudentId и ключом сортировки dueDate.

После того, как вы внесете необходимые изменения, AppSync сгенерирует ваш новый код GraphQL. Чтобы выполнить этот запрос и вернуть отсортированные результаты, выполните этот запрос:

GraphQL

query homework {
  homeworkByDueDate(
    homeworkStudentId: "some-user-id",
    sortDirection: DESC,
    limit: 10
  ) {
    items {
      id
      dueDate
      homeworkStudentId
    }
  }
}

Javascript

const res = await API.graphql(graphqlOperation(homeworkByDueDate,
  {
    sortDirection: ModelSortDirection.DESC,
    homeworkStudentId: user.id,
    limit: 10
  }))
console.log(res.data.homeworkByDueDate.items)

На заметку

  1. Вы можете создать только один GSI на amplify push. Если вы попытаетесь запустить более одного, CLI выдаст ошибку и откатит все обновления,
  2. GSI стоит денег. Для них предусмотрена пропускная способность, поэтому убедитесь, что она вам действительно нужна, прежде чем создавать. Это связано с глубоким пониманием вашей схемы перед развертыванием ресурсов.
  3. Вам необходимо создать GSI через AppSync CLI или панель инструментов, иначе созданная вами схема GraphQL не распознает новые возможности индекса и запросов таблиц. Это означает, что вы получите ошибки при попытке запроса с использованием нового queryField.

Хотите вернуть свои console.logs при бессерверной разработке? Оформить заказ Twig…