首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >GraphQL是否支持服务器端过滤(即在客户端构建类似于何处的查询)?

GraphQL是否支持服务器端过滤(即在客户端构建类似于何处的查询)?
EN

Stack Overflow用户
提问于 2017-04-17 12:57:40
回答 2查看 4K关注 0票数 4

我正在研究在GraphQL客户端应用程序和建立在关系SQL数据库之上的服务器应用程序之间使用React.js的可能性。应该在客户端创建查询,包括复杂的SQL样式语句,如:

代码语言:javascript
运行
复制
WHERE Customer.Age BETWEEN 22 AND 25
AND   Order.Status = 'Active'
OR    Product.Name LIKE '%foo%'

这意味着客户端通常只接收一小部分记录(例如10,而不是10M)。

这个好看的菲尔·斯特金文章声明了一些奇怪的东西:

我希望GraphQL能够帮助客户定义他们自己的作用域,过滤它们本身就是适当的数据,这将有助于识别API应该添加的作用域,作为方便的方法。 在这种情况下,GraphQL似乎并不能帮助API开发人员,但似乎有传言说将来会添加@filter来实现这一点。

在未来?现在GraphQL中没有过滤?我继续研究,发现了这个问题和这个惊人的交互式图形文档。这两个示例都使用了一个名为filter的特性,其中包含了一组像_gte这样的后缀。

代码语言:javascript
运行
复制
query combineMovies {
  allMovies(filter: {
    OR: [{
      AND: [{
        releaseDate_gte: "2009"
      }, {
        title_starts_with: "The Dark Knight"
      }]
    }, {
      title: "Inception"
    }]
  }) {
    title
    releaseDate
  }
}

但是,filter关键字在http://graphql.org上没有规范。我甚至检查了继电器文档,也没有发现复杂过滤的好例子(可能是因为我没有反应经验)。

请澄清GraphQL构建复杂SQL类查询的能力.它是标准特性的一部分,还是仅仅是一个弱支持的侧特性?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-20 14:07:38

我继续研究,发现了这个问题和这个惊人的交互式图形文档

谢谢你的好话!我是这篇文章的作者,很高兴这篇文章很有帮助!让我从Graphcool的角度回答您的问题。

GraphQL查询和字段

GraphQL查询是使用字段构建的。在这里,我们使用在id字段上定义的allMovies字段:

代码语言:javascript
运行
复制
query allMovies {
  allMovies {
    id
  }
}

有关围绕这篇文章查询的术语的更多信息,我建议阅读GraphQL。

查询参数

GraphQL定义了可以附加到字段的所谓查询参数。这些参数编码GraphQL服务器的其他信息,并影响字段的解析方式。一个常见的例子是first查询参数:

代码语言:javascript
运行
复制
query firstMovie {
  allMovies(first: 1) {
    id
  }
}

过滤是规范的一部分,还是仅仅是一项附带功能?

让我们进一步调查!

代码语言:javascript
运行
复制
query darkKnightMovies {
  allMovies(filter: {
    title_contains: "Dark Knight"
  }) {
    id
  }
}

在上面的查询中,filterallMovies字段的一个参数。如上面所示,在GraphQL规范中定义了这方面的语法。但是,GraphQL没有指定这个参数应该如何改变allMovies字段的解析。这仅由allMovies后端中的GraphQL字段的解析器的行为变化决定。

结论

GraphQL提供了所有必要的概念(查询、字段、参数)来支持服务器端过滤.然而,使用这些概念()来编码特定的行为,比如过滤,这取决于创建GraphQL API的开发人员。

票数 5
EN

Stack Overflow用户

发布于 2019-02-23 20:40:39

Graphql是一种规范,有不同的客户端和服务器实现,比如阿波罗、石墨酷和继电器。您在问题中粘贴的代码是客户端查询,它有点complex.In,我认为它更接近于查询生成器,而不是查询本身。

Graphql查询可以是简单的,也可以是复杂的,这完全取决于您是否在编写自己的服务器。

您可以向服务器发送简单的键值对,并在服务器端的解析器函数中构建数据库查询,并将查询提供给数据库以获取数据。或者,您可以在客户端构建格式良好的查询,并直接将这些查询提供给解析器函数中的数据库,而不需要碰它。我认为格拉奇酷选择了第二种方法。

因此,基本上涉及三个步骤:

  1. 客户端发送一些查询,基本上是一个带有序列化文本的GET或POST请求,
  2. 服务器上的Resolver函数获取它并从数据库中获取所请求的数据。
  3. 并返回响应,从而解析请求。

规范可能不会提到过滤,因为它是实现细节(它只是在post请求中使用的一个参数名称),尽管是这样,但只需阅读分页部分。

对于初学者来说,规范可能有点抽象,因此从像阿波罗服务器这样的实现服务器开始,可能是更好的方法和更简单的学习graphql的方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43451978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档