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 进阶之——聚合管道