在GraphQL中,如何通过客户端查询控制数据库查询?

在GraphQL中,如何通过客户端查询控制数据库查询?,graphql,graphql-js,Graphql,Graphql Js,这些天我学会了使用GraphQL。我认为,要构建查询,我需要构建三个部分: 模式 数据库查询功能 客户端查询 该查询返回一个用户的姓名和他的汽车。DB查询功能始终查询车辆 但有时我只需要用户的信息: { user (id: "1") { name } } 我不想查询汽车,所以我希望我的DB查询功能可以自动选择是否查询汽车 如何实现这一点?GraphQL.js将支持解析器函数的对象属性或方法;第页讨论了这一点 处理此问题的一种方法是将匿名函数直接插入到返回的对象中: { 用户:异

这些天我学会了使用GraphQL。我认为,要构建查询,我需要构建三个部分:

模式 数据库查询功能 客户端查询 该查询返回一个用户的姓名和他的汽车。DB查询功能始终查询车辆

但有时我只需要用户的信息:

{
  user (id: "1") {
    name
  }
}
我不想查询汽车,所以我希望我的DB查询功能可以自动选择是否查询汽车


如何实现这一点?

GraphQL.js将支持解析器函数的对象属性或方法;第页讨论了这一点

处理此问题的一种方法是将匿名函数直接插入到返回的对象中:

{ 用户:异步函数{id}{ const user=await DB.user.findOne{id}; user.cars==>DB.car.find{userId:id}; 返回车辆; } }
另一种方法是创建一个包装器对象,其中包含一个类,该类提供id属性和异步、惰性的cars方法;这方面的一些例子见。这种方法通常适用于大多数语言中的大多数GraphQL实现。

我认为您正在研究从GraphQL查询到db查询的自动创建/映射

每个查询都是特定于db/项目的,因此您应该创建此映射。你可以很容易地用软件包做到这一点

包中有“为什么粘贴”部分的副本:

基础REST api只能返回基于查询参数的字段

{
  user {
    profile {
      firstName
    },
    id
  }
}
是否应请求/api/user?字段=配置文件,id

{
  user {
    email
  }
}
是否应请求/api/user?字段=电子邮件 执行您的解析方法,如下所示:

resolve(root, args, context, info) {
    const topLevelFields = Object.keys(graphqlFields(info));
    return fetch(`/api/user?fields=${topLevelFields.join(',')}`);
}

最好避免将其全部压缩到一个解析器函数中。相反,为汽车创建一个单独的ObjectType,它有自己的字段和自己的解析器函数。这样,只有在请求该字段时才会调用car查询

在使用RDS的情况下,加入monster和data louder有助于优化查询的性能

它依赖于生成一个大的连接查询,还解决了只从数据库中准确请求所需字段的问题 它在引擎盖下使用facebook的dataloader——它不会解决查询哪些字段的问题,尽管示例使用了knex,这将使查询变得更容易,但它可以缓存和批处理您的查询
谢谢,这是一个更直接的解决方案。我已经查看了信息,但没有找到我需要的。这个模块很有用!一个优雅的解决方案。节省我的时间写如果!
{
  user {
    profile {
      firstName
    },
    id
  }
}
{
  user {
    email
  }
}
resolve(root, args, context, info) {
    const topLevelFields = Object.keys(graphqlFields(info));
    return fetch(`/api/user?fields=${topLevelFields.join(',')}`);
}