Фильтр и результат (AWS Amplify, AppSync, GraphQL)

В этом посте мы попытаемся разобраться, как работает поиск/фильтр и результат в AWS Amplify и AppSync.

Предварительные условия:

1/ Изучение GraphQL
2/ Моделирование данных
Если вы не знаете о моделировании данных, ознакомьтесь с моим предыдущим блогом о моделировании данных.

Если вы не имеете представления о каких-либо предварительных требованиях, я настоятельно рекомендую их изучить.

Директивы

@modal @auth @hasOne @hasMany @manyToMany @searchable @primaryKey @index

@searchable

  • Необходимо настроить ElasticSearch (в этом посте мы не будем этого делать)
  • Активный поиск и сортировка одновременно.

other directives

  • Я кратко описал другие директивы в блоге data-modeling. Если вы не знаете о других директивах, нажмите здесь, чтобы узнать.

Типы данных

  1. Скалярный тип: id, name, date_of_birth, got_job, gpa и т.д. (который имеет скалярное значение типа ID, String, Float, Int, Boolean, AWSDate и т.д.)
  2. Тип объекта: Статус, Студент (который является объектом javascript).

Поддерживаемые операции поиска

Тип данных Поддерживаемые операции
Строка ne, eq, match, matchPhrase, matchPhrasePrefix, multiMatch, exists, wildcard, regexp
Int ne, gt, lt, gte, lte, eq, range
Float ne, gt, lt, gte, lte, eq, range
Boolean ne, eq
Enum ne, eq, match, matchPhrase, matchPhrasePrefix, multiMatch, exists, wildcard, regexp
Объект не поддерживается

ne (не равно), eq (равно), gt (больше чем), lt (меньше чем), gte (больше или равно), lte (меньше или равно).

Без директивы @searchable

Мы можем сделать фильтр с директивой @searchable или без нее. Мы получим аргумент filter для каждого разрешителя списка, например (listStudents, listStatuses и т.д.).

  • Перейдите в DOCS или Documentation Explorer, а теперь найдите имя разрешителя списка, к которому вы хотите применить фильтр. Щелкните на любом разрешителе списка, к которому вы хотите применить фильтр. Здесь мы щелкаем на резольвере liststudents, чтобы применить фильтр.

  • Внутри listStudents мы получим аргумент filter. Нажмите на аргумент filter, чтобы увидеть, какие условия мы можем применить для фильтрации данных.

  • Внутри аргумента filter мы видим несколько полей, которые можно использовать для фильтрации данных. Если мы обратим внимание на поля аргумента, то увидим, что все опции фильтра доступны только для скалярного поля. Никакие объектные поля не доступны, например, status

Фиктивные данные для тестирования:

Мы создали некоторые данные для тестирования фильтрации. Если вы не знаете, как добавить документ/данные в базу данных или как работает отношение hasOne, hasMany, manyToMany, я предлагаю вам заглянуть в блог о моделировании данных. Теперь мы применим фильтр к приведенным ниже данным

{
  "data": {
    "listStudents": {
      "items": [
        {
          "id": "9f928a7a-f096-4ad8-b0cc-5b354dde6b18",
          "name": "Raisa",
          "email": "raisa@gmail.com",
          "gpa": 3.7,
          "got_job": true,
          "statusID": "b3a4a939-50ed-4d3c-a21e-8048834391f5",
          "status": {
            "is_enrolled": true,
            "is_passed": false
          },
          "date_of_birth": "1998-07-17",
          "exam_completed": 2
        },
        {
          "id": "31092e63-e421-4bbc-afe8-f2092e309442",
          "name": "Ashim",
          "email": "ashim@gmail.com",
          "gpa": 3.2,
          "got_job": false,
          "statusID": "2cc614a4-0bd1-4a8d-80a8-bc0c8372788b",
          "status": {
            "is_enrolled": false,
            "is_passed": true
          },
          "date_of_birth": "1998-04-15",
          "exam_completed": 3
        },
        {
          "id": "9a3a92df-e4be-4258-ae02-502e0bfd3745",
          "name": "Hasan",
          "email": "hasan@gmail.com",
          "gpa": 3.4,
          "got_job": false,
          "statusID": "840a91da-75ce-4cd5-8a41-58081763a933",
          "status": {
            "is_enrolled": true,
            "is_passed": false
          },
          "date_of_birth": "1998-03-22",
          "exam_completed": 1
        },
        {
          "id": "ff173ed6-5749-4a54-903b-025675f828e5",
          "name": "Minhaj",
          "email": "minhaj@gmail.com",
          "gpa": 3.7,
          "got_job": true,
          "statusID": "e1f9ccc1-132f-443a-9f37-821ed634cfc1",
          "status": {
            "is_enrolled": true,
            "is_passed": false
          },
          "date_of_birth": "1998-04-21",
          "exam_completed": 3
        },
        {
          "id": "bc70feab-da91-4ba5-a626-ee99c9f4c4a0",
          "name": "Totul",
          "email": "totul@gmail.com",
          "gpa": 3.4,
          "got_job": false,
          "statusID": "ca9064ff-5c2f-4634-8dca-d12f10acd1db",
          "status": {
            "is_enrolled": false,
            "is_passed": true
          },
          "date_of_birth": "1998-03-29",
          "exam_completed": 1
        },
        {
          "id": "514b1115-7c95-4037-884f-4d5eae58dc4b",
          "name": "Mahadhi",
          "email": "mahadhi@gmail.com",
          "gpa": 3.6,
          "got_job": true,
          "statusID": "ec2d4c20-4022-4084-9d52-19ec2cd18503",
          "status": {
            "is_enrolled": false,
            "is_passed": true
          },
          "date_of_birth": "1993-07-21",
          "exam_completed": 4
        },
        {
          "id": "7054f363-3f3c-4343-9dff-f7e4491a797f",
          "name": "Shuvo",
          "email": "shuvo@gmail.com",
          "gpa": 2.5,
          "got_job": false,
          "statusID": "1958dea4-59b4-4766-b725-476747b8b4c3",
          "status": {
            "is_enrolled": false,
            "is_passed": true
          },
          "date_of_birth": "1998-02-15",
          "exam_completed": 2
        },
        {
          "id": "bf74457b-a1e4-4715-880f-1425bedaaa09",
          "name": "Ayesha",
          "email": "ayesha@gmail.com",
          "gpa": 3.5,
          "got_job": false,
          "statusID": "3a86016e-b0d6-479f-a1d1-1effa0846457",
          "status": {
            "is_enrolled": true,
            "is_passed": false
          },
          "date_of_birth": "1998-07-17",
          "exam_completed": 2
        },
        {
          "id": "a2e5e97d-5f8d-493e-ba78-1701ca08d58e",
          "name": "Arif",
          "email": "arif@gmail.com",
          "gpa": 3.51,
          "got_job": true,
          "statusID": "840a91da-75ce-4cd5-8a41-58081763a933",
          "status": {
            "is_enrolled": true,
            "is_passed": false
          },
          "date_of_birth": "1998-03-27",
          "exam_completed": 1
        },
        {
          "id": "485b3f5a-8709-4902-82a6-4997c6a0839a",
          "name": "Navin",
          "email": "navin@gmail.com",
          "gpa": 3.4,
          "got_job": false,
          "statusID": "0e437cee-92f6-418a-bf90-af74a67a9943",
          "status": {
            "is_enrolled": true,
            "is_passed": false
          },
          "date_of_birth": "1993-06-24",
          "exam_completed": 3
        }
      ]
    }
  }
}
Войти в полноэкранный режим Выйти из полноэкранного режима

Использование аргумента filter: Фильтрация студентов по got_job

  1. got_job{ eq: $job }: Перейдите в проводник документации и щелкните на поле **got_job, мы увидим несколько условий с типами (eq: Boolean, ne: Boolean и т.д.)

  2. $job: Boolean: Укажите тип входного значения, потому что мы можем сопоставлять только с булевыми данными в соответствии с eq: Boolean.

Использование аргумента filter: Фильтрация студентов по gpa

  1. gpa{ ge: $point }: Перейдите в проводник документации и нажмите на поле gpa, мы увидим несколько условий с типами (ne: Float, ge: Float, eq: Float и т.д.) Мы используем условие ge и его значение Float. Поэтому мы должны взять значение float.

  2. Точка $: Float: Укажите тип входного значения, потому что в соответствии с ge мы можем сопоставить только число с плавающей точкой: Float

Использование вложенного аргумента фильтра: Фильтрация студентов по gpa и got_job

Здесь мы можем использовать операции and / или not. По умолчанию к запросу применяется операция and.

got_job : {eq: $job}, {exam_completed: {le: $exam}}: Данные будут показаны, если got_job и exam_completed оба удовлетворяют условиям.

Использование вложенного аргумента фильтра: Фильтрация студентов по got_job и exam_completed/email

got_job : {eq: $job}, or: [{exam_completed: {gt: $exam}}, {email: {eq: $email}}]: Данные будут показаны, когда got_job и exam_completed/email оба удовлетворяют условиям.

Использование аргумента limit & nextToken: Ограничение данных для пагинации

$limit: Int:

  1. Аргумент limit принимает целочисленное значение и выдает определенный объем данных.
  2. Здесь мы задаем значение limit 2. Поэтому запрос вернет максимум 2 документа/данных.

$token: String:

  1. Аргумент nextToken принимает значение String и выдает предстоящие документы/данные.
  2. Здесь мы предоставляем пустую строку в аргументе, потому что нам нужны все данные, имеющиеся в первом.
  3. Мы также получаем строку nextToken из поля запроса, которая предоставит нам предстоящие данные. Если значение nextToken равно null, это означает, что у нас не осталось данных.

$limit: Int:

  1. Здесь мы задаем предельное значение 2. Таким образом, запрос вернет максимум 2 документа/данных.

$token: String:

  1. Получаем строку nextToken из предыдущего запроса и указываем ее в поле аргумента nextToken, чтобы получить предстоящие документы/данные.
  2. Мы также получаем новую строку nextToken из поля запроса, которая предоставит нам предстоящие данные.

Использование аргументов filter & limit & nextToken:

Мы уже кратко описали все условия, поэтому сейчас мы только визуализируем/понимаем процесс.
Шаг-1| nextToken: «»:
Если nextToken — пустая строка, процесс ограничения начнется с 1-го элемента/элемента.

Шаг-2| limit: 2:
Процесс ограничения выберет 1-й & 2-й элемент/элемент.

Шаг-3| filter: condition:
Процесс фильтрации проверит 1-й & 2-й элемент/элемент. Если условие фильтра удовлетворяет, мы получим совпавший элемент. Здесь условие совпадает с одним элементом.

Шаг-1| nextToken: «»:
Если мы укажем nextToken, который мы получили из предыдущего запроса. Процесс ограничения начнется с ближайшего элемента. Здесь предстоящий элемент начинается с 3-го элемента/элемента.

Шаг-2| limit: 2:
Процесс ограничения выберет 3-й & 4-й элемент/элемент.

Шаг-3| Фильтр: условие:
Процесс фильтрации проверит 3-й & 4-й элемент/элемент. Если условие фильтра удовлетворяет, мы получим совпадающий элемент. Здесь условие совпадает с обоими элементами.

Que: Здесь мы фильтруем данные на основе скалярного поля «студент». Что если мы хотим отфильтровать данные на основе статуса студента (объектное поле студента)?

Решение:

  • Шаг-1: Связь между моделью Student и моделью Status — это отношение hasOne. Мы должны создать двунаправленную связь между моделью Student и моделью Status, чтобы получить данные о студентах в модели Status. Если вы не понимаете отношения между различными моделями, ознакомьтесь с этим блогом или не стесняйтесь оставлять комментарии ниже.

  • Шаг-2: Мы создали двунаправленную связь между обеими моделями. Но если мы не будем обновлять документы один за другим, то получим нулевое значение. Чтобы получить данные о студентах в таблице статусов, мы должны обновить каждый статус, указав идентификатор статуса в поле $id и идентификатор студента в поле $student_id.

  • Шаг-3: Получение отфильтрованных данных о зачисленных студентах.

С помощью директивы @searchable.

Добавляя @searchable, мы получаем некоторые дополнительные операции

  • агрегирование значений, таких как сумма, среднее, минимальное, максимальное значения
  • получить общее количество результатов поиска
  • сортировка результатов поиска по одному или нескольким полям.

Для правильной работы директивы @searchable необходимо настроить OpenSearch, а это уже другой блог.

На этом пока все. Спасибо за ваше терпение. Если этот блог помог вам, пожалуйста, откликнитесь.

Оцените статью
devanswers.ru
Добавить комментарий