Я учусь, как разрабатывать, используя 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 в полной мере.
Любая помощь или совет будет принята с благодарностью!