2016-08-30 52 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

相關問題