0

我想知道是否可以使用 graphql 来构造使用聚合过滤器的查询。就像是having max(customers) < 10

作为一个例子(请在我想指定计数作为条件之一的过滤条件):

query {
  allMovies {
    title
    _actorsMeta {
      count
    }
  }
  _allMoviesMeta(filter: {
    title_starts_with: "Inception"
    ***count : > 5***
  }) {
    count
  }
}
4

1 回答 1

3

GraphQL在规范级别上不支持这一点。这是有充分理由的。如果 GraphQL 规范支持过滤器和聚合,它将强制所有用户实现此功能,这可能非常低效,或者对于某些域/用例来说是不需要的。如果我的用户不需要它们,为什么我有实施/支持聚合?

但是 GraphQL 为您提供了灵活性,因此您始终可以通过参数为您的字段实现过滤/聚合。以您的示例为例,它可能如下所示:

query {
  allMovies {
    title
    _actorsMeta {
      count
    }
  }
  _allMoviesMeta(filter: {
    title: {startsWith: “Inception”},
    count: { gt: 5 }
  }) {
    count
  }
}

但是您必须在后端实现所有过滤逻辑。@batjko 在对类似问题的评论中发布了很好的解释:

每个 GraphQL 查询都由一个 resolve() 函数响应。您提供给查询的查询参数是此函数的参数。resolve() 函数然后消失并执行您想要的任何操作,例如从其他地方检索 SQL 查询的结果,然后您可以根据需要聚合该数据,最后返回所有结果作为您对 GraphQL 查询的响应.

如果您不控制后端,您可以在前端进行过滤/聚合。我是graphql-lodash的作者之一,它为您提供了一种指定结果转换的声明方式。您的查询可能如下所示:

query {
  allMovies {
    title
    _actorsMeta {
      count
    }
  }
  _allMoviesMeta @_(
    rejectIf: { 
      and: [
        { get: “сount”, gt: 5 }
        { get: “title”, startsWith: “Inception” }
      ]
    }
  ) {
    title
    count
  }
}

如果您使用 Apollo Client,请查看如何一起使用它的文章:Apollo Client 中的查询和转换搭配包括ReactAngular示例。

此外,欢迎您提供反馈或建议 - 只需在我们的GitHub 存储库中打开一个问题。

于 2017-05-27T22:48:03.810 回答