mongoose 入门

351 阅读4分钟

Mongoose

​ mongoose 是一 个让我们可以通过Node来操作MongoDB的模块。 ​ Mongoose是一 个对象文档模型( ODM)库(把文档转换为js 对象,易于操作),它对Node原生的MongoDB模块进行了进-步的优化封装,并提供了更多的功能。 ​ 在大多数情况下,它被用来把结构化的模式应用到一一个MongoDB集合,并提供了验证和类型转换等好处

  • 优点

    • 可以为文档创建一个模式结构(Schema)/或者叫做一种类似于SQL 数据库的约束

    • 可以对模型中的对象/文档进行验证

    • 数据可以通过类型转换转换为对象模型

    • 可以使用中间件来应用业务逻辑挂钩

    • 比Node原生的MongoDB驱动更容易

  • mongoose中为我们提供了几个新的对象

    • Schema(模式对象)

    ​ Schema对象定义约束了数据库中的文档结构

    • Model (对应MongoDB的 集合collections

    ​ Model对象作为集合中的所有文档的表示,相当于 MongoDB数据库中的集合collection

    • Document

    ​ Document表示集合中的具体文档,相当于集合中 的一个具体的文档

创建顺序 :Schema- >Model->Document

使用

安装

引入

连接

  • mongoose.connect 方法

mongoose.connect('mongodb://ip:端口/数据库名')

mongoose.connect('**mongodb**://localhost:27017/test',{ useUnifiedTopology: true ,useNewUrlParser:true})

//注:如果linux/windows的mongodb 设置了用户验证,需要在连接时输入用户名密码
mongoose.connect('mongodb://username:pass@127.0.0.1/crud?authSource=admin',{ useUnifiedTopology: true ,useNewUrlParser:true});
//authSource=admin 参数规定 用于验证的用户来自 admin 数据库

端口号若是27017,可省

  • 监听数据库连接状态

    mongoose 对象的connection 属性,可以绑定事件

    比如,可以通过open和**close **事件来监控连接 的打开和关闭。

  • 断开连接

    mongoose.disconnect() 一般不使用

  • 操作数据库

    • 创建 模式对象 Schema ,修饰文档结构

      const stuSchema=new mongoose.Schema({
          name:String,
          age:Number,
          address:String,
          gender:{
                  type:Number,
                  default:0
          }
      });
      
    • 创建Model 对象(创建集合)或者 Document 对象

      //mongoose.model(modelName, schema)  
      //modelName =集合名  ,会被转换为复数
      const StuModel= mongoose.model('studs',stuSchema); //返回一个构造函数
      
    • 操作

        //创建并插入文档
      StuModel.create({
              name:"baikujing",
              age:'100',
      },(err)=>{
              if(!err)
              {
                      console.log('插入成功');
              }
      })
      

mongoose 所有api 方法都返回 promise

Schema

MongoBD 本身很灵活,不需要设计结构

但是还是需要一定程度上 的 字段约束,保证 数据添加的 正确性,

使用Schema 模式结构对象,对文档的属性 字段进行描述,约束, 这样mongoose 还可以帮助我们进行验证类型转换

Model

Model 类 对应 集合,通过Model 操作数据库,也就是db.操作数据库

mongoose.model('studs',stuSchema);方法返回一个 构造函数new 构造出的就是 Document 实例

以下可以称作 Model 类静态方法

  • Model.create(doc(s),[options],[callback])

    • doc(s): Array/Object

    • options: 传递给 中间件 **save()**方法的参数

    • callback:(err,doc(s))/(错误对象,插入的内容)

    • return :Promise

      mongose 绝大部分方法 返回Promise ,可以使用then ,或者 await

  • Model.find(filter ,[projection] ,[options],[callback])

    • filter :查询条件

    • projection :投影对象或字段**字符串,**决定结果要显示的字段

    • options: 查询选项,skip,limit,sort 等

    • callback :(err,docs) docs 始终为数组

      回调函数必传或者使用then(await )接收返回数据,否则不会查询

      //projection 参数
      //1. 使用mongodb 的对象形式
      
      StuModel.find({age:1000},{name:true,_id:0}).then(docs=>{
              console.log(docs);
      })
      //2. 使用字符串
      StuModel.find({age:1000},'name age -_id').then(docs=>{
              console.log(docs);
      })// -_id  不显示_id
      
      //options 查询选项 参数
      StuModel.find({},'name age -_id',{skip:3,limit:3,sort:{age:-1}}).then(docs=>{
              console.log(docs);
      })
      
      
      // 使用 then 处理 promise
      StuModel.find({age:1000}).then(docs=>{
              console.log(docs);
      })
      
  • Model.findOne(filter ,[projection] ,[options],[callback])

    查询第一个返祖filter 的文档对象

    callback: (err,doc) doc单个文档对象

    doc 是 Model 构造方法 构造出的实例

  • Model.findByID(id,[projection] ,[options],[callback])

    callback: (err,doc) doc单个文档对象

  • Model.update(filter ,doc,[options],[callback])

    • options: 选项,multi 等

    • callback :( error, updateWriteOpResult)

      updateWriteOpResult:原生 mongoDB 返回的操作结果

      回调函数必传或者使用then(await )接收返回数据,否则不会更新

    StuModel.update({name:'zhubajie'},{$set:{age:1000}},{multi:true},(err)=>{})
    
    

    updateWriteOpResult

    属性

    • n:匹配到的个数
    • nModified:更改个数
    • ok:更新是否成功
  • Model.updateMany(filter ,doc,[options],[callback])

  • Model.updateOne(filter ,doc,[options],[callback])

  • Model.replaceOne(filter ,doc,[options],[callback])

  • Model.remove(filter ,[options],[callback])

    • options

    • callback

      回调函数必传或者使用then(await )接收返回数据,否则不会更新

      StuModel.deleteOne({name:"666"},err=>{})
      
  • Model.deleteOne(filter ,[options],[callback])

  • Model.deleteMany(filter ,[options],[callback])

其他

  • Model.count(filter,[callback])

    统计 个数

    // 统计所有个数
    StuModel.count({},(err,count)=>{
            console.log(count);
    })
    StuModel.countDocuments({},(err,count)=>{
            console.log(count);
    })
    

将在下一个版本移除,推荐使用countDocuments 方法代替 in v 5.927

Document

Document 是Model 构造的 实例

//创建 Document 实例
const stu=new StuModel({
        name:"小米",
        age:20
});

console.log(stu);

实例方法

  • doc.save([options],callback)

    将文档保存到集合

    • callback :(err,updateWriteOpResult)
  • doc.update(update,[options],callback)

    • update

    • callback : (err)

      回调函数必传或者使用then(await )接收返回数据,否则不会更新

将要弃用 ,推荐 document.updateOne/updateMany 代替 in v 5.927

// 创建一个 docuemnt 对象
const stu = new StuModel({
        name: "小米",
        age: 20
});


(async function () {
         await stu.save();
        StuModel.findOne({ name: "小米" }, async (err, doc) => {
                console.log(doc);
                let res;
                 doc.update({ $set: { age: 777 } });
                // console.log(res);
            
                //第二种方法
                doc.address = "武汉小米";
                res = await doc.save();
                // console.log(res);
            //删除
                res = await doc.remove();
                // console.log(res);
        })

})()
  • doc.remove([callback])

  • doc.get(feild)

  • doc.set(feild,value)

  • doc.toJSON([options])

    转换为JSON对象

  • doc.toObject([options])

​ 返回 js 普通对象,返回的对象 没有Document 的实例属性和方法

​ options 和toJSON方法一致

Mongoose 的模块化

抽离模块

  • 连接模块

    专门用于和数据库进行连接

  • 模型对象模块

    抽象出不同的Model 对象,并导出,在路由内调用,操作数据库

放置在不同文件夹