【问题标题】:GraphQL query based on a specific value of a field基于字段特定值的 GraphQL 查询
【发布时间】:2019-09-22 12:14:37
【问题描述】:

我希望能够使用他们的 GraphQL API 从 GitHub 检索特定存储库的最新版本。为此,我需要获取 isDraft 和 isPrerelease 为假的最新版本。我设法得到了第一部分,但不知道如何做查询的“where”部分。

这是我得到的基本查询 (https://developer.github.com/v4/explorer/):

{
  repository(owner: "paolosalvatori", name: "ServiceBusExplorer") {
    releases(first: 1, orderBy: {field: CREATED_AT, direction: DESC}) {
      nodes {
        name
        tagName
        resourcePath
        isDraft
        isPrerelease
      }
    }
  }
}

返回:

{
  "data": {
    "repository": {
      "releases": {
        "nodes": [
          {
            "name": "3.0.4",
            "tagName": "3.0.4",
            "resourcePath": "/paolosalvatori/ServiceBusExplorer/releases/tag/3.0.4",
            "isDraft": false,
            "isPrerelease": false
          }
        ]
      }
    }
  }
}

我似乎无法找到一种方法来做到这一点。部分原因是我是 GraphQL 新手(第一次尝试进行查询),我不确定如何提出我的问题。

只能根据支持参数的类型(如以下存储库和发布)“查询”吗?似乎应该有一种方法可以在字段值上指定过滤器。

存储库:https://developer.github.com/v4/object/repository/

发布:https://developer.github.com/v4/object/releaseconnection/

节点:https://developer.github.com/v4/object/release/

【问题讨论】:

    标签: graphql github-api github-api-v4


    【解决方案1】:
    {
      repository(owner: "paolosalvatori", name: "ServiceBusExplorer") {
        releases(first: 1, orderBy: {field: CREATED_AT, direction: DESC}) {
          nodes(isDraft :false , isPrerelease :false ) {
            name
            tagName
            resourcePath
            isDraft
            isPrerelease
          }
        }
      }
    }
    

    或者,请查看 GraphQL 指令,因为有时需要根据值跳过或包含字段 @skip 或 @include。

    skip 指令,当用于字段或片段时,允许我们根据某些条件排除字段。

    include 指令,允许我们根据某些条件包含字段

    GraphQL Directives

    【讨论】:

      【解决方案2】:

      只能根据支持参数的类型“查询”

      是的:GraphQL 并没有像 SQL 那样定义通用查询语言。您不能以服务器和应用程序架构未提供的方式对字段结果进行排序或过滤。

      我希望能够使用他们的 GraphQl API 从 GitHub 检索特定存储库的最新 [非草稿、非预发布] 版本。

      正如您已经发现的那样,the releases field on the Repository type 没有对这些字段进行排序或过滤的选项。相反,您可以使用多个 GraphQL 调用一次迭代一个版本。这些看起来像

      query NextRelease($owner: String!, $name: String!, $after: String) {
        repository(owner: $owner, name: $name) {
          releases(first: 1,
                   orderBy: {field: CREATED_AT, direction: DESC},
                   after: $after) {
            pageInfo { lastCursor }
            nodes { ... ReleaseData } # from the question
          }
        }
      }
      

      以您现在运行它的相同方式运行它(我已将识别存储库的信息拆分为单独的 GraphQL 变量)。您可以在第一次调用时不使用 after 变量。如果(如您的示例中)它返回"isDraft": false, "isPrerelease": false,则您已设置。如果没有,您需要再试一次:从响应中的lastCursor 获取值,然后运行相同的查询,将该游标值作为after 变量值传递。

      【讨论】:

        猜你喜欢
        • 2021-05-04
        • 2020-08-15
        • 1970-01-01
        • 1970-01-01
        • 2021-10-04
        • 1970-01-01
        • 2018-07-01
        • 1970-01-01
        • 2019-05-17
        相关资源
        最近更新 更多