接着上节学习graphql+node+express+mongodb实现增删改查及两表关联。
schema
以集合user
为例子:
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
}
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var userSchema = new Schema({
name: String,
age: Number
});
module.exports = mongoose.model("user", userSchema)
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的可以直接进入下面步骤:
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
}
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)
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(数据库)实现增删改查及表关联已已经完成啦 ✌️ ✌️✌️,因为是初次接触,若有问题欢迎在下面指正!