mongo 进阶之—— mongoose 基本操作
Posted twinkle||cll
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mongo 进阶之—— mongoose 基本操作相关的知识,希望对你有一定的参考价值。
在上一篇文章中介绍了,怎么使用mongoose来连接数据库,现在来实现一个简单的crud。
schema
schema 是mongoose中定义的模型,下面咋们就以学生为例,来建立一个模型
student模型
学生一般都有,学号,姓名,年龄,班级,爱好等属性
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var stuObj = new Schema({
stuNo: {
// 类型
type: String,
// 是否必须
required: true,
// 是否是唯一的
unique: true,
// 去掉首位空格
trim: true,
// 最小长度
minlength: 3,
// 最大长度
maxlength: 18,
},
name: {
// 类型
type: String,
// 必须
required: true,
// 去掉首位空格
trim: true,
// 最小长度
minlength: 2,
// 最大长度
maxlength: 10,
},
age: {
type: Number,
// 默认值
default: 18,
},
loves: {
// 这个爱好是一个字符串类型的数组
type: [String],
default: [],
},
address: {
// 家庭地址是一个对象类型,里面必须包含省市
type: {
province: {
type: String,
required: true,
},
city: {
type: String,
required: true,
},
},
required: true
},
});
// 把模型映射到数据库中
var StuSchema = mongoose.model("Students", stuObj)
复制代码
模型的验证的方式比较多,具体查看文档,这里只展示如何使用
新增文档
既然连接数据库好了,模型也好了,接下来就最模型进行操作,一切的操作都从新增开始。
方式一:nodejs的写法(回调函数的形式)
var obj = {
stuNo: "20210101",
name: " twinkle ",
loves: ["code", "打豆豆"],
address: {
province: "江西省",
city: "赣州市",
},
};
// 新增学生的方式
var userModel = new StuSchema(obj);
userModel.save(function (err) {
if (err) {
console.log(err, '-----保存失败')
}
console.log('保存成功!')
})
复制代码
代码运行结果
数据库真实的结果
方式二,使用es6的写法
由于模型的save方法是一个promise,所以在现在肯定是可以使用promise来处理的。
var obj = {
stuNo: "20210102",
name: " marry ",
loves: ["学习", "还是学习"],
address: {
province: "江西省",
city: "赣州市",
},
};
// 新增学生的方式
async function addStu(obj) {
var userModel = new StuSchema(obj);
var result = await userModel.save();
console.log(result,'---保存结果')
}
addStu(obj)
复制代码
代码运行结果
数据库真实的结果
注意
有的人说,怎么老是成功的,应该需要些失败来看看mongoose的作用,那么咋们就来看看这个失败是怎么处理的
1. 名字重复
当名字重复的时候,会触发mongoose的验证,直接你给报错
2.obj对象和模型不匹配更多
当字段多余的时候,mongoose会自动帮你把多余的字段去掉,并且会根据schema的规则来整理成合适的格式保存数据。
3. obj字段更少
这里毫不疑问,字段少了肯定触发规则验证,报错。这里就不演示了
由于上面的两种方法,都只是js的更新带来的,在以后的代码书写中,肯定是推荐使用es6以上的写法,所以在下面的案例中就只会用es6的写法,node回调函数的写法请自行体验。
查询文档
新增好了数据,接下来就查询数据了。
用 mongoose 查询文档相当容易啦,它支持 MongoDB 的高级( rich )查询语法。 查询文档可以用 model
的 find, findById, findOne, 和 where 这些静态方法。查询比较多,这里只演示最基础的,详情的查询后面在出文章。
async function findStu(name){
var res = await StuSchema.find({name:name});
console.log(res);
}
findStu('twinkle');
复制代码
查询的结果如下
如果不存在的结果,查询返回的是啥呢?
修改文档
/**
* 修改文档
* @param {*} condition 条件
* @param {*} updCon 修改的内容
*/
async function updStu(condition, updCon){
var res = await StuSchema.update(condition,updCon);
console.log(res);
}
updStu({name: 'mack'},{name:'jack'})
复制代码
结果
但是这个方法已经过时了,控制台会报一个警告⚠:
修改后的如下:
/**
* 修改文档
* @param {*} condition 条件
* @param {*} updCon 修改的内容
*/
async function updStu(condition, updCon){
var res = await StuSchema.updateOne(condition,updCon);
console.log(res);
}
updStu({name: 'jack'},{name:'jack1',abc:1232})
复制代码
细心的同学发现了,我们在修改的时候,添加了些无效的属性。结果还是可以完成修改的,但是数据库的真正的内容是啥呢?
删除
写的好不好都没有关系,能看到这里的人肯定很牛,我给你点赞👍👍👍
删除其实很简单如下:
/**
* 删除文档
* @param {*} condition 条件
*/
async function delStu(condition){
var res = await StuSchema.deleteOne(condition);
console.log(res);
}
delStu({name:'jack1'})
复制代码
数据库真实结果
有的人要说,条件不存在。这个删除啥?
以上是关于mongo 进阶之—— mongoose 基本操作的主要内容,如果未能解决你的问题,请参考以下文章