【问题标题】:How to get an array or list as result from a graphql query?如何从 graphql 查询中获取数组或列表?
【发布时间】:2019-10-25 04:44:29
【问题描述】:

您好,我是 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({});
    }
   }

但是我想知道是否有一种方法可以直接从查询中获取这些分数,而不是将它们保存在数据库中。我尝试将类型更改为 new GraphQLList(GraphQLFloat) 并返回一个包含 scr 值的数组,但我在 graphql api 中收到一个错误,说我的突变中有错误的输出类型。

【问题讨论】:

  • 你确定你想要的结果的语法:` [[id:1209,score:3.5],[1203,4.5]....]?? Or should you meant [[id:1209 ,score:3.5],[id:1203,score:4.5]....]?`
  • 不,我的意思是 [[1209,3.5],[1203,4.5]] 我只写了 id 和 score 来显示我希望保存值的顺序。是否可以从查询中获取数组?如果是,返回值应该是什么类型?

标签: mongodb graphql-js


【解决方案1】:

在我看来,从您的架构中,您可以获取结果,作为对象数组,输出如下:

[
    {
        id: 1,
        license: "value1"
    },
    {
        id: 2,
        license: "value2"
    }
]

如果这就是您所需要的,那么 近似 查询应该可以工作:

query Resource {
    id
    url
    license
    licenseScore
}

一旦有了对象数组,就可以将其转换为数组数组,尽管我不建议这样做。

由于您刚刚开始使用 GraphQL,因此我推荐了以下资源:

  • HowToGraphql: GraphQL 上的干净视频/帖子
  • Apollo Graphql 的文档和博客。这是queries 上的帖子之一

另外,如果您想测试您的查询并习惯它们,请使用GraphQL Playground

【讨论】:

  • 您好,感谢您的回答和链接,我将检查它们。然而,这就是我现在在我的代码中所做的。我想知道是否可以从 ResourceType 的字段中删除 LicenseScore 以避免更新(当我有很多资源时需要很长时间)。有没有办法只返回我为每个资源计算的 scr 值数组而不是 ResourceType 对象数组?
  • 我很难理解您想要达到的目标。据我所知,您想查询您的资源,并在对查询的响应中添加计算字段(在本例中为 licenseScore)。对吗?
  • 然后,您必须简单地定义一个新查询,从数据库中获取结果,然后在将响应返回给客户端之前,通过应用与许可证相关的逻辑来修改响应和分数。您在updateAllLicenses 中输入的逻辑相同。由于您知道如何创建突变,我的猜测是您忽略了您也可以创建查询,这将是解决您的需求的正确位置。至少,如果我对您的情况的理解是正确的。
  • 让我知道它是否有效。如果你愿意,我很乐意看一下代码,只需在 github 上分享即可
猜你喜欢
  • 2018-07-09
  • 2018-08-04
  • 2020-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-30
  • 2019-02-06
相关资源
最近更新 更多