Я новичок в бэкэнд-разработке и GraphQL, и хотел знать, есть ли лучший способ сделать это:
В настоящее время, чтобы получить нужные мне данные, я должен выполнить этот запрос:
{
user(id: "123456789") {
...
...
languages{
language {
language
}
level{
level
}
}
}
}
// query result:
{
"data": {
"user": {
...
...
"languages": [
{
"language": {
"language": "French"
},
"level": {
"level": "Native"
}
},
{
"language": {
"language": "English"
},
"level": {
"level": "Intermediate"
}
}
]
}
}
}
... но мне бы хотелось использовать что-то вроде этого:
{
user(id: "123456789") {
...
...
languages{
language
level
}
}
}
// query result:
{
"data": {
"user": {
...
...
"languages": [
{
"language": "French",
"level": "Native"
},
{
"language": "English",
"level": "Intermediate"
}
]
}
}
}
В MongoDB у меня есть коллекция для "Языков" и еще одна для " Languages_Levels ", и я ссылаюсь на идентификаторы этих элементов в" пользовательских "документах.
Моя схема GraphQL выглядит следующим образом:
const UserType = new GraphQLObjectType({
name: "User",
fields: () => ({
...
...
languages: { type: new GraphQLList(LanguagesType) }
})
});
const LanguagesType = new GraphQLObjectType({
name: "Languages",
fields: () => ({
language: {
type: LanguageType,
resolve(parent, args) {
return LanguageModel.findById(parent.languageId);
}
},
level: {
type: LanguageLevelType,
resolve(parent, args) {
console.log(parent.levelId);
return LanguageLevelModel.findById(parent.levelId);
}
}
})
});
const LanguageType = new GraphQLObjectType({
name: "Language",
fields: () => ({
id: { type: GraphQLID },
language: { type: GraphQLString }
})
});
const LanguageLevelType = new GraphQLObjectType({
name: "LanguageLevel",
fields: () => ({
id: { type: GraphQLID },
level: { type: GraphQLString }
})
});
Мне кажется, это слишком сложно. Есть ли лучший, более сексуальный способ выполнить sh этот запрос и получить результат, упомянутый выше?
Кроме того, поскольку я новичок в бэкэнд-разработке, не стесняйтесь комментировать мой подход "структура БД", поскольку я не уверен, что это хорошая идея - хранить данные «Languages» и «Languages_Levels» в отдельных коллекциях. Должен ли я воспользоваться функцией «богатого документа» MongoDB для такого рода «четко определенных» данных? (но что, если в будущем я хочу переименовать «Native» в «God-like» для примера, и применить ли это изменение ко всем заинтересованным пользователям?)