Фильтры GraphQL в GatsbyJS - PullRequest
       5

Фильтры GraphQL в GatsbyJS

0 голосов
/ 29 января 2019

У меня возникают проблемы с пониманием того, как писать фильтры для запросов GraphQL в GatsbyJS.

Это работает:

filter: { contentType: { in: ["post", "page"] }

Мне в основном нужна обратная сторона, например:

filter: { "post" in: { contentTypes } } // where contentTypes is array

Это не работает, потому что "ИМЯ ожидается" (где "post" в моем примере).

После прохождения GatsbyJS docs Я нашел это:

elemMatch: short for element match, this indicates that the field you are filtering will return an array of elements, on which you can apply a filter using the previous operators

filter:{
  packageJson:{
    dependencies:{
      elemMatch:{
        name:{
          eq:"chokidar"
        }
      }
    }
  }
}

Отлично!Это то что мне нужно!Поэтому я пробую это и получаю:

error GraphQL Error Field "elemMatch" is not defined by type markdownRemarkConnectionFrontmatterTagsQueryList_2.

Ключевые слова, определенные в markdownRemarkConnectionFrontmatterTagsQueryList_2 :

  • eq: string |null;
  • ne: string |null;
  • регулярное выражение: строка |null;
  • glob: string |null;
  • in: Array |null;

Почему я ограничен этими ключевыми словами, когда в документах упоминается больше таких ключевых слов, как elemMatch?Почему мне не разрешено использовать структуру фильтра "element in: {array}"?

Как я могу создать этот фильтр?

1 Ответ

0 голосов
/ 29 января 2019

Фильтр по значению в массиве

Допустим, у вас есть блог уценки с categories в виде массива строк, вы можете фильтровать сообщения с "историческим" в categories, например:

{
  allMarkdownRemark(filter:{
    frontmatter:{
      categories: {
       in: ["historical"]
      }
    }
  }) {
    edges {
      node {
        id
        frontmatter {
          categories
        }
      }
    }
  }
}

Вы можете попробовать этот запрос в любом из блоков graphiq в Gatsby.js документах .


ElemMatch

Я думаю elemMatch включен только для полей с массивом объектов;что-то вроде comments: [{ id: "1", content: "" }, { id: "2", content: ""}].Таким образом, вы можете применять дополнительные фильтры к полям каждого comment:

comments: { elemMatch: { id: { eq: "1" } } }

Вот пример, который вы можете попробовать в блоках graphiq в документах gatsby:

// only show plugins which have "@babel/runtime" as a dependency
{
  allSitePlugin (filter:{
    packageJson:{
      dependencies: {
        elemMatch: {
          name: {
            eq: "@babel/runtime"
          }
        }
      }
    }
  }) {
    edges {
      node {
        name
        version
        packageJson {
          dependencies {
            name
          }
        }
      }
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...