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 中的查询和转换搭配。包括React和Angular示例。
此外,欢迎您提供反馈或建议 - 只需在我们的GitHub 存储库中打开一个问题。