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.
中打开一个问题
我想知道是否可以使用 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.
中打开一个问题