接着上节学习graphql+node+express+mongodb实现增删改查及两表关联。
先定义schema
以集合user
为例子:
- graphql中定义schema(schema.js)
type User{ name:String, age:Int, id:String, status:String, msg:String } type Query { getUser:[User] } type Mutation{ createUser(argsMutify:MutifyUser):User updateUser(argsMutify:MutifyUser):User deleteUser(id:String):User } input MutifyUser{ name:String, age:Int, status:String, msg:String, id:String }
- 数据库中(models/user.js)
var mongoose = require('mongoose'); var Schema = mongoose.Schema; var userSchema = new Schema({ name: String, age: Number }); module.exports = mongoose.model("user", userSchema)
resolver
- 查
getUser() { return User.find(); //User是在resolver文件中引入的集合 }
- 增
async createUser(root, { argsMutify }) { let newData = {}; await User.findOne({ //在User集合中查找增加的数据是否存在 "name": argsMutify.name }).then(async (dataUser) => { if (!dataUser) { await User.insertMany(argsMutify) .then((data) => { newData = data[0]; }); newData.status = 200; newData.msg = "增加成功!" } else { newData.status = 403; newData.msg = "增加失败,数据已存在!" } }); return newData; }
- 改
async updateUser(root, { argsMutify }) { let newData; await User.findByIdAndUpdate({ _id: argsMutify.id }, { $set: { name: argsMutify.name, age: argsMutify.age } }, { new: true //加上此句返回的数据是修改之后的,否则返回的是修改之前的 }).then((data) => { if (data) { newData = data; newData.status = 200; newData.msg = "编辑成功!" } else { newData.status = 403; newData.msg = "编辑失败!" } }) return newData }
- 删
async deleteUser(root, { id }) { let newData = {}; await User.deleteOne({ "_id": id }).then((data) => { newData.status = 200; newData.msg = "删除成功!" }) return newData }
表关联
以两个表(user
和post
)之间的关联为例子(user集合中的id与post集合中的author关联),所以在上面的schema
中加入定义集合post
的内容。两表关联用populate
与aggregate
2种方法,但是后者关联时拿不到数据,所以采用前者关联表,在使用之前先得了解populate的语法,若会用populate的可以直接进入下面步骤:
- graphql中定义schema
type Post{ title: String, content: String, id:String, author:User, msg:String, status:String } type Query { getPost(author:String):Post } type Mutation{ createPost(argsMutify:MutifyPost):Post } input MutifyPost{ title: String, content: String, author:String, msg:String, status:String }
- 数据库中model
-
user集合中的model与schema
var mongoose = require('mongoose'); var Schema = mongoose.Schema; var userSchema = new Schema({ name: String, age: Number }); module.exports = mongoose.model("user", userSchema)
-
post集合中的model与schema
var mongoose = require('mongoose'); var Schema = mongoose.Schema; var postSchema = new Schema({ title: String, content: String, author: {type: Schema.Types.ObjectId, ref: 'user'} // ref选项可以告诉Mongoose在填充过程中使用哪种模型,在示例中是User模型。在此处存储的所有_id必须是User模型中的文档_id。 }); module.exports = mongoose.model("post", postSchema)
-
- resolver
- 查
async getPost(root, agrs, context) { let message; await Post.findOne({ "author": agrs.author }) .populate('author', 'name age').exec() .then((post) => { message = post; }); return message; }
- 增
async createPost(root, { argsMutify }) { let newData={}; await Post.findOne({ "author":argsMutify.author }).then(async(data)=>{ if(!data){ await Post.insertMany(argsMutify).then((dataPost) => { newData=dataPost[0]; }) newData.status=200; newData.msg="增加成功!" }else{ newData.status=403; newData.msg="增加失败,数据已存在!" } }) return newData; }
- 查
graphql结合apollo-serve(中间件)、express(快速搭建服务)、mongoDB(数据库)实现增删改查及表关联已已经完成啦 ✌️ ✌️✌️,因为是初次接触,若有问题欢迎在下面指正👇👇👇!