如何在GraphQL中查询缺失指定关联关系的记录?
GraphQL查询缺失特定关联记录的实现方案
支持性说明
GraphQL本身只是API查询格式规范,没有内置的关联存在性判断语法,能不能直接检索出缺失某类关联的记录,完全取决于对应GraphQL服务端在schema中暴露的查询、过滤能力,不存在跨所有GraphQL服务通用的固定写法。
针对给出模型的查询方法
示例数据模型中Bar通过foo_id字段关联Foo,绝大多数常规设计的GraphQL服务会在Foo类型下挂载反向关联的Bar集合字段,类型定义大致如下:
type Foo { id: ID! bars: [Bar!]! # 所有关联到当前Foo的Bar记录 }
如果服务端实现了关联维度的过滤参数(基于Prisma、Hasura、Nexus等常见工具搭建的GraphQL服务默认支持这类能力),可以直接在查询的where条件中传入关联为空的判断规则,常见写法示例:
# 适用于支持_none关联过滤规则的服务(比如Hasura) query FindFoosWithoutBars { foos(where: { bars: { _none: {} } # 匹配没有任何关联Bar的Foo记录 }) { id } }
不同服务端的过滤关键字存在差异,可能遇到的其他合法写法包括:
# 适用于暴露了关联计数字段的服务 query FindFoosWithoutBars { foos(where: { barsCount: { eq: 0 } }) { id } } # 适用于支持_exists存在性判断的服务 query FindFoosWithoutBars { foos(where: { bars: { _exists: false } }) { id } }
如果对接的GraphQL服务没有暴露任何关联维度的过滤能力,就无法通过单条服务端查询直接拿到目标结果,需要分三步在客户端做二次筛选:
- 查询全量Foo的id列表
- 查询全量Bar记录携带的所有
foo_id,去重得到被关联的Foo id集合 - 本地筛选出id不在上述关联集合中的Foo,就是没有关联任何Bar的记录
内容的提问来源于stack exchange,提问作者Nelu
相关产品推荐
相关产品推荐

