在上一篇文章中介绍了,怎么使用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'}) 复制代码
数据库真实结果
有的人要说,条件不存在。这个删除啥?