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 的 findfindByIdfindOne, 和 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 基本操作的主要内容,如果未能解决你的问题,请参考以下文章

mongo 进阶之—— mongoose 认识

mongo 进阶之—— mongoose 认识

基本节点/mongo/mongoose 连接不起作用

Mongoose 中的 Mongo BSON 类型

Mongoose 中的 Mongo BSON 类型

mongo 进阶之——聚合管道