graphql 是否支持聚合过滤器?

Does graphql support filters on aggregates?

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

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

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

GraphQL 在规范级别不支持此。这是有充分理由的。如果 GraphQL 规范支持过滤器和聚合,它将强制所有用户实现此功能,这可能非常低效,或者在某些 domains/use 情况下不需要。如果我的用户不需要它们,为什么我有 implement/support 聚合?

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

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

但是您必须在后端实现所有过滤逻辑。 @batjko 在 :

的评论中发布了很好的解释

Every GraphQL query is responded to by a resolve() function. The query parameters you give to the query are the arguments to this function. The resolve() function then goes away and does anything you want, say retrieve the results of a SQL query from elsewhere, then you can aggregate that data as you like, and finally return the outcome of all that as your response to the GraphQL query.

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

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

如果您使用 Appollo Client,请查看有关如何一起使用它的文章:Query and transformation collocation in Apollo Client. React and Angular 包含示例。

此外,欢迎您提供反馈或建议 - 只需在我们的 GitHub repository.

中打开一个问题