GraphQL - только возвращаемые данные, которые содержат определенное поле - PullRequest
1 голос
/ 10 апреля 2019

Я использую GraphQL в рамках GatsbyJs.

У меня есть несколько файлов с данными JSON.Структура данных похожа на эту:

{
 ...,
 "sections" / "menuSections"
}

Последнее поле может быть либо «section», либо «menuSections» в каждом файле.Мой текущий запрос graphQL выглядит следующим образом:

{
  allDataJson {
    nodes {
      menuSections
    }
  }
}

Этот запрос возвращает правильные «menuSections», однако файлы данных, которые не имеют «menuSections», возвращаются как null.Как я могу заставить GraphQL возвращать данные только из файлов, которые содержат «menuSections», то есть как вернуть данные, в которых существуют «menuSections».Я ищу оператора как $exists.

Ответы [ 2 ]

1 голос
/ 11 апреля 2019

, если sections & menuSections - строка или массивы строки, может быть, вы можете фильтровать для null:

{
  "menuSections": "..."
}
// query
{
  allDataJson(filter: {
    menuSections: {
      ne: null
    }
  }) {
    nodes {
      menuSections
    }
  }
}

Если они являются объектами, вы все равно можете фильтровать для null, но это должно быть применено к одному из полей внутри этого объекта.Если у ваших объектов нет общего поля, это не сработает:

{
  "menuSections": {
    "menuSectionField": "..."
  }
}
// query
{
  allDataJson(filter: {
    menuSections: {
      menuSectionField: {
        ne: null
      }
    }
  }) {
    nodes {
      menuSections
    }
  }
}

Если они являются массивом объектов, вы можете сделать то же самое, но с помощью elemMatch:

{
  "menuSections": [
    { "menuSectionField": "..." },
    { "other": "..." }
  ]
}
// query
allDataJson(filter: {
    menuSections: {
      elemMatch: {
        menuSectionField: {
          ne: null
        }
      }
    }
  }) { ... }

В худшем случае наихудший, я думаю, вы могли бы определить некоторые типы пользовательских типов, обеспечивающие существование menuSections, чтобы вы могли запрашивать allDataWithMenuSections и т. Д., Но если фильтр работает, это намного проще.

1 голос
/ 10 апреля 2019

Похоже, что в GraphQL нет оператора $exists.Вместо этого вы можете добавить некоторую логику в распознаватель, чтобы проверить, не является ли поле пустым.Я нашел два старых вопроса, связанных с вашим:
Запрос GraphQL и проверил возвращенные данные
Запрос GraphQL: включайте поле, только если не ноль

...