2016-08-30 75 views
1

如何从Graphql的多个集合中返回数据?如何从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

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

所以您的查询就会是这个样子:

query { 
    jobs { 
    _id 
    company { 
     name 
    } 
    } 
} 

您已经有工作下决心功能,现在您只需要定义一个又一个的公司。想必你的工作集合或者包含公司(和名称)在其文档,或者它包含了公司的_id,所以你在公司的决心功能做的是这样的:

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

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

+0

resolve(job,args,context,info){ return companyCollection.findOne({_id:job.companyId}); } 这里你没有使用rootValue作为解析函数中的一个参数。什么是rootValue? – chyangba

+0

我刚刚将rootValue变量重命名为job,这就是它的原因。我在答案结尾处发布的链接解释了根值的来源。 – helfer

相关问题