我想知道graphql是否可用于构建使用聚合过滤器的查询。像having max(customers) < 10
作为一个例子(请过滤标准,我想指定计数作为标准之一):
query {
allMovies {
title
_actorsMeta {
count
}
}
_allMoviesMeta(filter: {
title_starts_with: "Inception"
***count : > 5***
}) {
count
}
}
答案 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。包含React和Angular个例子。
此外,欢迎您提供反馈或建议 - 只需在GitHub repository中打开一个问题。