你好,我是graphql的新手,我想知道是否有可能在我的架构中创建一个根查询,该查询将返回一个数组或列表。
更准确地说,我在架构中创建了以下类型:
const ResourceType = new GraphQLObjectType({
name:'Resource',
fields:()=>({
id: {type: GraphQLID},
url: {type: GraphQLString},
title: {type: GraphQLString},
author: {type: GraphQLString},
license:{type: GraphQLString},
LicenseScore: {type: GraphQLFloat},
})
});
我想查询数据库中的所有资源,以便获得它们的许可证类型,然后根据许可证分配分数。是否有可能获取每个资源的许可证并返回如下数组的查询:[[id:1209,score:3.5],[1203,4.5] ....]?
我创建了一个将分数更新到数据库的突变,这里是:
updateAllLicenses: {
type: new GraphQLList(ResourceType),
async resolve(parent,args){
var licns;
var scr;
await Resource.find({}).then(async function(results){
var num = results.length;
var scr=0;
for (var i=0; i<num; i++){
if (! (results[i].license in licenseScores)){
scr = 0;
}
else{
scr = licenseScores[results[i].license];
}
await Resource.findByIdAndUpdate(results[i].id{LicenseScore:scr});
}
});
return await Resource.find({});
}
}
但是,我想知道是否有一种方法可以直接从查询中获取这些分数,而不是将其保存在数据库中。我尝试将类型更改为新的GraphQLList(GraphQLFloat)并返回具有scr值的数组,但是在graphql api中收到错误消息,说我突变中的输出类型错误。
答案 0 :(得分:0)
在您的模式中,在我看来,您能够以对象数组的形式获取结果,如下所示:
[
{
id: 1,
license: "value1"
},
{
id: 2,
license: "value2"
}
]
如果这是您所需要的,那么近似查询应该可以工作:
query Resource {
id
url
license
licenseScore
}
一旦有了对象数组,就可以将其转换为数组数组,尽管我不建议这样做。
由于您刚刚开始使用GraphQL,因此我推荐以下资源:
此外,如果您想测试查询并习惯查询,请使用GraphQL Playground