graphql是否支持聚合过滤器?

时间:2017-05-19 17:23:21

标签: reactjs graphql react-apollo apollo-client

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

这样的东西

作为一个例子(请过滤标准,我想指定计数作为标准之一):

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

1 个答案:

答案 0 :(得分:3)

GraphQL不支持规范级别的 。而且有一个很好的理由。如果GraphQL规范支持过滤器和聚合,则会使所有用户都无法实现此功能,这可能效率非常低,或者某些域/用例不需要。如果我的用户不需要它,为什么我有实现/支持聚合?

但GraphQL为您提供了灵活性,因此您始终可以通过参数为字段实现过滤/聚合。举个例子,它可能看起来像吼叫:

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

但是你必须在你的后端实现所有的过滤逻辑。 @batjko在the similar question的评论中发布了一个很好的解释:

  

每个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
  }
}

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

此外,欢迎您提供反馈或建议 - 只需在GitHub repository中打开一个问题。