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

Решение (задание, args, context, info) { return companyCollection.findOne ({_id: job.companyId}); } Здесь вы не использовали rootValue в качестве аргумента в функции разрешения. Что такое rootValue ??? – chyangba

+0

Я просто переименовал переменную rootValue в задание, что и есть. Ссылка, которую я опубликовал в конце моего ответа, объясняет, откуда взялось корневое значение. – helfer

Смежные вопросы