Как вы можете вставить в поле массива в схеме MongoDB в приложении MERN, используя GraphQL? - PullRequest
0 голосов
/ 14 февраля 2020

Я учусь, как разрабатывать, используя MongoDB, express, реагировать, нод и GraphQL. Я много исследовал и у меня проблемы с пониманием одной концепции. Мое приложение в основном представляет собой приложение для рецептов, где пользователи могут использовать рецепты CRUD и иметь коллекцию поваренных книг в Интернете.

Имея это в виду, я создал эту схему:

const CookbookProfileSchema = mongoose.Schema({
    fName: String,
    lName: String,
    email: {type: String, lowercase: true, unique: true, required: [true, "can't be blank"], match: [/\S+@\S+\.\S+/, 'is invalid'], index: true},
    password: String,
    cookbook: [{
      recipe: {
        rTitle: String,
        rDescription: String,
        rCookTime: String,
        rIngredients: [{
          iName: String,
          iMeasurement: String,
        }],
        rInstructions: [{
          text: String
        }]
    }
  }]    
});

До сих пор я использовал только базы данных SQL, и я нашел учебные пособия, показывающие мне, как создавать 2 разные схемы с отношения, но с этого момента я не был бы лучше с реляционной базой данных?

Это мои определения типов:

const typeDefs = `
  type Query {
    userProfiles: [UserProfile]
    userLookup(id: ID!): [UserProfile]
    userLogin(email: String, password: String): [UserProfile]
  }
  type UserProfile{
    id: ID!
    fName: String
    lName: String
    email: String
    password: String
    cookbook: [Recipe]
  }

  type Recipe{
    rTitle: String
    rDescription: String
    rCookTime: String
    rIngredients: [Ingredient]
    rInstrctions: [Instruction]
  }

  type Ingredient{
    iname: String
    iMeasurement: String
  }

  type Instruction{
    text: String
  }

  type Mutation {
    createUser(fName: String, lName: String, email: String, password: String): UserProfile
    removeUser(id: ID!): Boolean
    updateUser(id: ID!, fName: String, lName: String): Boolean
    updatePassword(id: ID!, password: String): Boolean
  }
` 

И это мои решатели пока:

const resolvers = {
  Query: {
    userProfiles: () => UserProfile.find(),
    //userLogin: async (_, {id}) => await UserProfile.findById(new ObjectID({id}))
    userLookup: (_, {id}) => UserProfile.find(ObjectId(id)),
    userLogin: (_, email, password) => UserProfile.find(email, password)
  },
  Mutation: {
    //User CRUD Mutations
    createUser: async (_, {fName, lName, email, password }) => {
      const user = new UserProfile({ fName, lName, email, password, cookbook: null});
      await user.save();
      return user;
    },
    removeUser: async (_, {id}) => {
      await UserProfile.findByIdAndRemove(id);
      return true;
    },
    updateUser: async (_,{id, fName, lName}) => {
      //Code in front end to check if the fname or lname is null
      await UserProfile.findByIdAndUpdate(id, {fName , lName });
      return true;
    },
    updatePassword: async (_, {id, password}) => {
      await UserProfile.findByIdAndUpdate(id, { password });
      return true;
    },

  }
}

const server = new GraphQLServer({ typeDefs, resolvers })
mongoose.connection.once('open', function() {
  server.start(() => console.log('Server is running on localhost:4000'))
});

Я хочу, чтобы у пользователя было много рецептов, в рецепте может быть много ингредиентов и много инструкций, чтобы я мог отобразить его в формате списка, который он может отметить только для этого сеанса или состояния. В реляционной базе данных у меня будет таблица рецептов, и они будут относиться к пользователю. Инструкции и ингредиенты будут связаны с рецептом. Тогда для представления я просто запросил бы все рецепты, принадлежащие этому пользователю, чтобы сделать кулинарную книгу. Как я могу сделать что-то подобное здесь, или я должен просто go реляционный маршрут? Я действительно хочу испытать, как использовать mongodb в полной мере.

Любая помощь или совет будет принята с благодарностью!

1 Ответ

0 голосов
/ 14 февраля 2020

Полагаю, вы уже узнали, что у вас нет методов отношений hasMany, belongTo et c в MongoDB. Однако вы можете смоделировать отношения реляционного типа с MongoDB. Проверьте здесь .

Хотя я должен подчеркнуть, что "имея как можно больше таблиц для представления различных объектов данных (нормализация данных)" , как мы это делаем для SQL баз данных, может быть плохой схемой дизайн для баз данных No SQL, таких как MongoDB. В большинстве случаев вам лучше иметь документы, которые связаны друг с другом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...