如何使用GraphQL在MERN应用程序的MongoDB模式中插入数组字段?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用GraphQL在MERN应用程序的MongoDB模式中插入数组字段?相关的知识,希望对你有一定的参考价值。

我正在学习如何使用MongoDB进行开发,表达,反应,节点和GraphQL。我进行了很多研究,并且在把握一个概念时遇到了问题。我的应用程序基本上是一个食谱应用程序,用户可以对食谱进行增删改查,并可以在线收集食谱。

考虑到这一点,我创建了这个架构:

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'))
});

我打算让用户拥有许多食谱,一个食谱可以包含许多成分和许多说明,因此我可以以列表类型格式显示该菜单,他们可以针对该会话或状态进行检查。在关系数据库中,我将有一个配方表,并使它们与用户相关。说明和成分将与配方有关。然后,对于该视图,我只需查询属于该用户的所有食谱即可制作食谱。在这里我该如何做类似的事情,还是应该走关系路线?我真的很想体验如何充分使用mongodb。

任何帮助或建议,我们将不胜感激!

答案

我想您已经发现您在MongoDB中没有hasManybelongTo e.t.c关系方法。但是,您可以使用MongoDB对关系类型关系进行建模。 Check here

尽管,我要强调,像对SQL数据库一样,“具有尽可能多的表来表示不同的数据实体(数据规范化)”对于NoSQL数据库(如MongoDB)可能不是一个好的模式设计。在大多数情况下,最好让彼此相关的文档。

以上是关于如何使用GraphQL在MERN应用程序的MongoDB模式中插入数组字段?的主要内容,如果未能解决你的问题,请参考以下文章

当同时使用 GraphQL 时,Nodejs 和 Express 在 MERN 堆栈 Web 应用程序中的作用是啥?

部署后的 GraphQL 拒绝连接

Reactql - 使用 graphql 的 react-redux

如何在单个液滴上将不同的 MERN 应用程序部署到数字海洋?

如何使用 Multer 在 MERN Stack 应用程序中上传图像文件

如何使用后端文件夹内的前端将 MERN 应用程序部署到 Heroku