如何从Graphql中返回多个集合中的数据?

时间:2016-08-30 08:49:53

标签: graphql graphql-js

如何从Graphql中返回多个集合中的数据?

const jobsCollection = db.collection('jobs');

const companysCollection = db.collection('company');


import {
  GraphQLList,
  GraphQLObjectType,
  GraphQLSchema,
  GraphQLString,
  GraphQLInt,
  GraphQLFloat,
  GraphQLEnumType,
  GraphQLNonNull
} from 'graphql';


const Company = new GraphQLObjectType({
  name: 'Company Name',
  description: 'test',
  fields: () => ({
    _id: {type: GraphQLString},
    name: {type: GraphQLString},
    address : {type: GraphQLString}
  }

  })
});

通过以下查询,我也想查询公司集合。我怎么能这样做?

const Job = new GraphQLObjectType({
  name: 'job',
  description: 'test',
  fields: () => ({
    _id: {type: GraphQLString},
    name: {type: GraphQLString},
    skill_set : {type: GraphQLString},
    company: {type: Company}
  }

  })
});

##通过以下查询,我也想查询公司集合。我怎样才能做到这一点? ##

const Query = new GraphQLObjectType({
  name: "Queries",
  fields: {
    jobs: {
      type: new GraphQLList(Job),
      resolve: function(rootValue, args, info) {
        let fields = {};
        let fieldASTs = info.fieldASTs;
        fieldASTs[0].selectionSet.selections.map(function(selection) {
          fields[selection.name.value] = 1;
        });
        return jobsCollection.find({}, fields).toArray();
      }
    }
  }
});

1 个答案:

答案 0 :(得分:2)

GraphQL中的架构和查询不关心您的数据是在一个,两个还是十个集合中。您甚至可以在不同数据库中的许多不同服务器上拥有数据。 GraphQL服务器通过遵循您在模式中定义的关系,然后为响应中的每个字段运行所谓的解析函数来获取实际数据,从而加入(即组合您案例中来自不同集合的数据)。

所以你的查询看起来像这样:

query {
  jobs {
    _id
    company {
      name
    }
  }
}

您已经拥有了解决职务的功能,现在您只需要为公司定义另一个功能。据推测,您的作业集合在其文档中包含公司(和名称),或者它包含公司的_id,因此您在公司解析函数中所要做的就是这样:

resolve(job, args, context, info){
  return companyCollection.findOne({ _id: job.companyId });
}

我写了一篇较长的中文帖子,更详细地解释了GraphQL的执行。你可以找到它here