Apollo GraphQL服务器:通过单独解析的字段进行筛选(或排序)

Apollo GraphQL服务器:通过单独解析的字段进行筛选(或排序),graphql,apollo-server,Graphql,Apollo Server,我可能面临的设计限制是,我想问一下是否有解决办法 我的模式包含类型Thing,该类型具有字段标志。我希望能够通过标志的值过滤内容,但如果单独解析此字段,则似乎不可能。如果我想对事物进行排序,也会出现同样的问题。下面是一个例子: 类型事物{ id:字符串! 标志布尔值! } 类型查询{ things(仅适用于whereflagistrue:Boolean):[things!]! } const解析器={ 事情:{ 标志:异步({id})=>{ 常量值=等待getFlagForThing(id);

我可能面临的设计限制是,我想问一下是否有解决办法

我的模式包含类型
Thing
,该类型具有字段
标志
。我希望能够通过
标志
的值过滤
内容
,但如果单独解析此字段,则似乎不可能。如果我想对
事物进行排序
,也会出现同样的问题。下面是一个例子:

类型事物{
id:字符串!
标志布尔值!
}
类型查询{
things(仅适用于whereflagistrue:Boolean):[things!]!
}
const解析器={
事情:{
标志:异步({id})=>{
常量值=等待getFlagForThing(id);
返回值;
}
},
查询:{
异步事物(obj,{onlyWhereFlagIsTrue=false}){
让结果=等待getThingsWithoutFlags();
如果(仅适用于标记位置){
// ↓这不起作用,因为标志仍然未定义
result=551;.filter(结果,['flag',true]);
}
返回结果;
}
}
}
在解析所有异步字段后,是否有任何方法可以过滤
内容
?我知道我可以调用
getFlagForThing(id)
inside
things
resolver,但这不就是重复我自己吗?解析
标志
背后的逻辑可能比只调用一个函数要复杂一些

UPD:这是迄今为止我能找到的最好的解决方案。非常难看,很难扩展到其他领域:

const解析器={
事情:{
flag:async({id,flag})=>{
//需要检查标志是否已被解析
//避免两次调用getThingsWithoutFlags()
如果(!\未定义(标志)){
返回标志;
}
常量值=等待getFlagForThing(id);
返回值;
}
},
查询:{
异步事物(obj,{onlyWhereFlagIsTrue=false}){
让结果=等待getThingsWithoutFlags();
如果(仅适用于标记位置){
//需要时异步解析标志
const promissions=uz.map(结果,({id})=>
getFlagForThing(id)
);
const flags=等待承诺。全部(承诺);
for(设i=0;i
我认为这里的问题实际上不是Apollo server的局限性,更多的是因为您有一个带有解析器的原语字段。通常,最好仅在字段将返回单独类型时,才对该字段使用解析程序:

Thing {
    id: ID!
    flag: Boolean!
    otherThings: OtherThing
}

Query {
    things(onlyWhereFlag: Boolean): [Thing!]!
}
在本例中,可以为
其他事物
使用单独的解析器,但如果某个字段是基元,则我将只解析该字段和该事物。
使用原始模式:

const filterByValuePair=([key,value])=>obj=>obj[key]==value;
常量解析程序={
查询:{
异步事物(父对象,{onlyWhereFlag}){
const things=等待承诺(
(等待getThings()).map(
事情=>
新承诺(异步解析=>
决心({
事情
flag:等待getFlagForThing(东西)
})
)
)
);
如果(仅限此处标志){
return things.filter(filterByValuePair(['flag',true]);
}否则{
归还物品;
}
}
}
};
如果
flag
不是一个原语怎么办?好吧,如果你想按它过滤,那么你会有几个不同的选择。这些选项实际上取决于如何获取“标志”数据。如果您能提供更多关于您的模式和数据模型的详细信息,我很乐意详细说明