Ограничение полей, получаемых от MongoDB, в соответствии с GraphQL запросом
Используемые модули:
[email protected]
[email protected]
[email protected]
Модель коллекции Category предусматривает несколько полей:
name, decription, itemsInCategory
Клиент через GraphQL запрашивает данные:
query {
item {
category {
description
}
}
}
Нет никакого смысла делать выборку всех полей из базы данных на такой запрос, поэтому ограничиваю выборку следующим образом:
/graphQL/resolvers/category.js
module.exports = {
category: async (parent, args, { models, fieldsFilter }, gqlModel ) => {
return await models.Categories.findById( parent.category, fieldsFilter(gqlModel) );
},
};
index.js
const fieldsFilter = function( gqlModel ) {
let res = [];
gqlModel.fieldNodes.forEach( fNode => {
res = res.concat( fNode.selectionSet.selections.map( el=>el.name.value ) );
} );
return res;
};
const server = new ApolloServer( {
typeDefs,
resolvers,
context: ()=> {
return { models, fieldsFilter }
}
} );
Всё работает как и хочется - от базы данных запрашиваются только те поля, которые нужно будет вернуть клиенту, ничего лишнего.
Вот только не покидает чувство, что это велосипед (функция fieldsFilter).
Есть ли готовые решения?