当前位置: 首页 > 知识库问答 >
问题:

GraphQL动态查询生成

凌清夷
2023-03-14

我有一个GraphQL服务器,它能够为指定源提供timeseries数据(例如,传感器数据)。获取传感器数据的示例查询可能是:

query fetchData {
    timeseriesData(sourceId: "source1") {
      data {
        time
        value
      }
    }
}

在我的前端,我想允许用户选择一个或多个源,并显示一个图表,每一个都有一行。通过使用下面这样的查询,似乎可以实现以下操作:

query fetchData {
    series1: timeseriesData(sourceId: "source1") {
      data {
        time
        value
      }
    }
    series2: timeseriesData(sourceId: "source2") {
      data {
        time
        value
      }
    }
}

大多数GraphQL教程似乎关注于静态查询(例如,唯一改变的是变量,而不是请求的实际形状)--但在我的例子中,我需要查询本身是动态的(为我选择的每个ID提供一个timeseriesData请求)。

  1. 修改服务器的架构不是一个选项(例如,因此我不能将ID数组传递给解析器)
  2. 我的查询是使用模板字符串指定的,例如GQL`...`
  3. 我不想手动将查询构建为字符串,因为这似乎会导致灾难,并意味着我将失去所有工具的优点(例如自动完成、语法高亮显示、链接)

我使用的堆栈是:

  • Apollo客户端(特别是apollo-angular)
  • 角度
  • 打字
  • graphql-tag(用于定义查询)

共有1个答案

胡劲
2023-03-14

您可以使用片段定义公共字段,并将变量绑定在该片段上@include(if:Boolean)@skip(if:Boolean)指令,以获取在执行时已知的动态字段。

根据spec,最好避免手动字符串插值来构造动态查询。

指令1允许包含或跳过基于作为查询变量传递的布尔表达式的字段。指令可以附加到字段或片段包含,并且可以以服务器希望的任何方式影响查询的执行。

query Hero($episode: Episode, $withFriends: Boolean!) {
  hero(episode: $episode) {
    name
    friends @include(if: $withFriends) {
      name
    }
  }
}
{
  "episode": "JEDI",
  "withFriends": false
}
 类似资料:
  • Spring官方JPA规范文档 我对非常陌生,所以任何指导都很有价值。

  • 我试图从动态表中选择对象,但当我运行我的代码时,我得到了一些错误...有一种方法可以做到这一点...我用的是JPAHibernate和后遗症 这里是错误。。。 org.springframework.dao.InvalidDataAccessResourceUsageExc0019,"dedegMessage":"org.springframework.dao.InvalidDataAccessR

  • 和相应的查询解析器 这里的主要想法只是有一个过滤器,可以看到什么食谱有一些成分,用户会通过应用程序通知。 我使用数据库中的所有食谱获得了“recipe”查询,但我需要一个获取这些食谱的查询,然后使用field comprient进行筛选,例如: 食谱-糖蛋糕,配料:糖、蜂蜜、四个… 配方-天鹅绒蛋糕,配料:糖、香草、... 并且用户通知Sugar,API应该返回这2个食谱,但是如果用户通知Suga

  • 假设我有一个生成的实体,如下所示: 我的输入值是字段名称(“可用性”、“生日”、“CVID”...)和一个字符串值,我应该使用它对所有字段执行“like”。 我想从以下字段名开始构建一个查询: null 我试图使用PathBuilder,但似乎要使用“getString或getBoolean”之类的方法,就必须知道要提取的字段的类型。在我的例子中,由于我只是从字段名开始,所以我不能使用这些方法,也

  • 大家好,我试着做一个方法来应用条件一个SelectQuery,但我不知道如何通过名称获得字段或通过名称获得表,代码示例... 但字段总是空的... 我怎么解决这个。

  • 我的webapp中有一个过滤器,允许按车辆类型、品牌、燃油、州和城市进行搜索,但所有这些过滤器都是可选的。 如何使用存储库实现这一点。 控制器类 服务类 我还没有实现任何东西,因为我不知道如何实现这个过滤器。 车辆等级 车型和品牌是另一张桌子上的...我是葡萄牙人我把密码翻译成了英文... 当它发生时,我需要做什么?