GraphQL能否从数组筛选单个对象?如何修改查询语句?
在GraphQL中筛选数组获取单个对象的实现方法
完全可以实现,而且这个筛选操作是在服务端完成的——GraphQL的字段参数逻辑由服务端定义,查询时传入筛选条件后,服务端会直接返回过滤后的结果,无需客户端再处理全量数据。
一、修改查询语句的两种情况
1. 服务端已为bigArray字段提供筛选参数
如果你的GraphQL服务端已经给bigArray字段定义了筛选参数(比如id),直接在查询里传入目标ID即可,推荐用变量传参的方式(更灵活且符合规范):
const selectedId = 'n32j23h' const query = gql` query getData($targetId: ID!) { dataObj { # 传入id参数筛选出目标对象 bigArray(id: $targetId) { id name } } } `; // 调用查询时传入变量 // 示例(以Apollo Client为例):client.query({ query, variables: { targetId: selectedId } })
如果服务端设计为直接返回单个对象(更贴合“获取单个对象”的需求),字段可能命名为bigArrayItem之类,写法类似:
const query = gql` query getData($targetId: ID!) { dataObj { bigArrayItem(id: $targetId) { id name } } } `;
2. 服务端未提供筛选参数(临时方案)
如果服务端没给bigArray加筛选参数,只能先查询全量数组,再在客户端过滤,但这种方式不推荐——会浪费带宽,也失去了GraphQL按需获取数据的优势。示例如下:
// 先查询全量数组 const query = gql` query getData { dataObj { bigArray { id name } } } `; // 客户端过滤出目标对象 const result = await client.query({ query }); const targetItem = result.data.dataObj.bigArray.find(item => item.id === selectedId);
二、服务端的处理逻辑(简单说明)
服务端的Resolver函数会接收你传入的id参数,然后对bigArray对应的数据源进行过滤。比如用JavaScript编写Resolver的示例:
const resolvers = { DataObj: { bigArray: (parent, args) => { // parent是dataObj对应的数据源 // args包含查询时传入的id参数 return parent.bigArray.filter(item => item.id === args.id); // 如果要直接返回单个对象,用find代替filter即可 // return parent.bigArray.find(item => item.id === args.id); } } };
内容的提问来源于stack exchange,提问作者SuavekN
相关产品推荐
相关产品推荐

