如何按 GraphQL 中的字段值过滤列表对象?

时间:2021-01-23 15:35:26

标签: graphql

假设我有以下 json 数据:

"data": {
    "continents": [
        {
            "code": "AF",
            "name": "Africa",
        },
        {
            "code": "EU",
            "name": "Europe"
        },
        // ...
    ]
}

使用 code : "AF" 获取列表项的正确 GraphQL 查询是什么?换句话说,如何产生以下结果:

"data": {
    "code": "AF",
    "name": "Africa"
}

到目前为止,我已经:

query {
  continents {
    code
    name
  }
}

但这只是返回完整的数组。

我一直在运行我的示例:https://lucasconstantino.github.io/graphiql-online/

2 个答案:

答案 0 :(得分:0)

对于当前的示例,您可以这样做

query {
  continents(filter: {code: {eq: "AF"}}) {
    name
  }
}

我建议查看有关参数的 documentation,因为它们解释得很好。

答案 1 :(得分:0)

事实证明,列表/数组上没有定义内置的 filter 函数! GraphQL(查询语言)基本上是关于在对象 [Schemas and Types | GraphQL] 上选择字段

只需要看一下GraphQL schema in question

type Query {
  continents(filter: ContinentFilterInput): [Continent!]!
  // ...
}
type Continent {
  code: ID!
  name: String!
  countries: [Country!]!
}
input ContinentFilterInput {
  code: StringQueryOperatorInput
}
input StringQueryOperatorInput {
  eq: String
  ne: String
  in: [String]
  nin: [String]
  regex: String
  glob: String
}
// ...

我们看到查询 continents 有一个输入类型为 filter 的参数 ContinentFilterInput。这些信息足以让我们开始构建过滤查询:

query {
  continents(filter: ...) {
    code
    name
  }
}

在检查 ContinentFilterInput 时,我们观察到它有一个输入类型为 code 的字段 StringQueryOperatorInput

query {
  continents(filter: { code: ...}) {
    code
    name
  }
}

最后,我们在输入类型 eq 中找到了一个字段 StringQueryOperatorInput,它是一个标量类型 (String),我们就完成了:

query {
  continents(filter: { code: { eq: "AF" } }) {
    code
    name
  }
}