Как применить фильтр к GraphQL, работающему на JSON-файле? - PullRequest
1 голос
/ 10 июня 2019

Я пытаюсь выполнить запрос GraphQL к файлу JSON. Он работает хорошо, но когда я пытаюсь добавить фильтр, он все равно показывает все записи.

Мой файл данных JSON

Моя схема JSON

GraphQL:

{
  allDataJson(filter: {content: {elemMatch: {activityMeta: {contentType: {eq: "iframe-game"}}}}}) {
    edges {
      node {
        content {
          name
          type
          link
          description
          content {
            score
            gameOverTitle
            gameOverProgress
          }
          activityMeta {
            contentLink
            contentType
            inScene
            backgroundImages {
              path
            }
          }
        }
      }
    }
  }
}

Структура папок:

enter image description here

Конфигурация данных JSON:

enter image description here

Результаты запроса GraphQL:

enter image description here

1 Ответ

1 голос
/ 10 июня 2019

Ваш запрос возвращает только один узел, а фильтры предназначены только для фильтрации узлов (а не данных внутри узлов).

Похоже, что вы пытаетесь запросить только content с activityMeta.contentType === "iframe-game".

Вы можете разбить свой JSON на отдельные файлы?Если да, то вы можете фактически создать разные типы узлов с помощью gatsby-transformer-json.

При условии, что структура папок:

src/
  data/
    category.json
    content.json
    contentGroup.json
    menu.json

, вы можете создать разные типы узлов для каждого файла, например так:

    plugins: [
        {
          resolve: `gatsby-transformer-json`,
          options: {
            typeName: ({ node }) => {
              return node.relativePath.split('.').slice(0, -1).join('.')
            }
          }
        },
        ...
    ]

, и это позволит вам делать отдельные запросы, такие как allCategory, allContent, allContentGropup, allMenu.

Как только вы окажетесь в этой точке, вы легко отфильтруете запрос allContent, чтобы он совпадал только с узлами, если node.activityMeta.contentType === "iframe-game" со следующим запросом

    query MyQuery {
      allContent(filter: {activityMeta: {contentType: {eq: "iframe-game"}}}) {
        nodes {
          name
          activityMeta {
            contentType
            contentLink
            inScene
            backgroundImages {
              path
            }
          }
          type
          link
          description
          content {
            score
            gameOverTitle
            gameOverProgress
          }
        }
      }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...