Как мне изменить мою схему, чтобы получить этот результат? - PullRequest
0 голосов
/ 04 марта 2020

Я новичок в бэкэнд-разработке и 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» для примера, и применить ли это изменение ко всем заинтересованным пользователям?)

...