Mongoose (快速入门)

mongoose 学习

mongoose 基础

介绍

  • Mongoose 是一个让我们可以通过Node来操作MongoDB数据库的一个模块
  • Mongoose 是一个对象文档模型(ODM)库,它是对Node原生的MongoDB模块进行了进一步的优化封装
  • 大多数情况下,他被用来把结构化的模式应用到一个MongoDB集合,并提供了验证和类型装换等好处
  • 基于MongoDB驱动,通过关系型数据库的思想来实现非关系型数据库

优势/好处

  1. 为文档创建模式结构(Schema),也可以说是约束
  2. 对模型中的对象/文档进行验证
  3. 数据可以通过类型装换装换为对象模型
  4. 可以使用中间件来应用业务逻辑挂钩
  5. 相比MongoDB驱动更容易

new Object

  • Schema(模式对象)

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

  • Model

    ——Model 对象作为集合中的所有文档的表示,相当于MongoDB中的collection,它的每一个实例就是一个document文档

  • Document

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

  • 关系:Schema生成Model,Model创造Document

简单使用

前提:安装MongoDB,Nodejs

  1. 下载安装Mongoose

    npm i mongoose --save

  2. 项目中引入mongoose

    var mongoose = require(‘mongoose’)

  3. 连接MongoDB数据库

    mongoose.connect(‘mongodb://数据库ip地址 : 端口号( 默认端口27017可以省略 )/数据库名’)

    数据库连接状态

    • connect()返回的是一个待定状态,在mongoose中有一个属性叫 connection 用来表示数据库的连接

    • 通过监视该对象可以用来监听数据库的连接与断开

    • 数据库连接成功事件

      mongoose.connection.once(‘open’ , () => {})

    • 数据库断开事件

      mongoose.connection.once(‘close’ , () => {})

  4. 创建Schema(模式)对象

    var stuSchema = new Schema({})

    • 通过Schema创建Model
    • Model 代表的是数据库中的集合,通过Model才能对数据库进行操作
  5. 映射

    var stuModel = mongoose.model(‘student’,stuSchema)

    参数

    1. 要映射的集合名

    2. 创建的约束(Schema对象)

  6. 通过映射返回的值对数据库进行增、删、改、查

  7. 断开数据库连接(一般不使用)

    mongoose.disconnect()

使用案例

var mongoose = require('mongoose')
var Schema = mongoose.Schema;
//连接数据库
mongoose.connect('mongodb://localhost:27017/student',{
    useNewUrlParser: true 
})

//监听数据库连接状态
mongoose.connection.once('open',()=>{
    console.log('数据库连接成功……')
})
mongoose.connection.once('close',()=>{
    console.log('数据库断开……')
})

//创建Schema对象(约束)
var stuSchema = new Schema({
    name: String,
    age: Number,
    gender:{
        type: String,
        default:'male'
    },
    addr: String
})

//将stuSchema映射到一个MongoDB collection并定义这个文档的构成
var stuModle = mongoose.model('student',stuSchema)

//向student数据库中插入数据
stuModle.create({
    name:"小明",
    age:"20",
    addr:"天津"
},(err,docs)=>{
    if(!err){
        console.log('插入成功'+docs)
    }
})
/*
* 控制台结果:
* 数据库连接成功……
* 插入成功{
*   gender: 'male',
*   _id: 6017a189372ece49089d79c7,
*   name: '小明',
*   age: 20,
*  addr: '天津',
*   __v: 0
* }
*/
/*
* 数据库结果:
* | _id                      | gender | name | age  | addr | __v  |
* | ------------------------ | ------ | ---- | ---- | ---- | ---- |
* | 6017a189372ece49089d79c7 | male   | 小明  | 20   |  天津 | 0    |
*/

模式(Schemas)

  • 每个 schema 都会映射到一个 MongoDB collection 并定义这个collection里的文档结构

  • 支持的字段类型

    类型作用
    String定义字符串
    Number定义数字
    Date定义日期
    Buffer定义二进制
    Boolean定义布尔值
    Mixed定义混合类型
    ObjectId定义对象ID
    Array定义数组
  • 创建一个 schema 对象

    const mongoose = require('mongoose')
    //调用 Schema
    const Scheme = mongoose.Schema
    
    //创建 schema 对象
    var stuSchema = new Schema({
        name: String,
        age: Number,
        gender:{
            type: String,
            default:'male' //定义默认类型
        },
        addr: String
    })
    
  • 在Schema定以后添加字段时需要使用 add() 方法

    var schema = new Schema()
    schema.add({stuId:Number,})
    
  • timestamps

    ——当 schema 中设置timestamps为 true 时,schema映射的文档 document 会自动添加 createdAt 和 updatedA t这两个字段,代表创建时间和更新时间

    var stuSchema = new Schema({
        {...},
        { timestamps:true }
    })
    
  • _id

    ——当未定义_id字段时 mongoose 会为每一个文档自动添加一个不重复的_id,类型为ObiectId(在查询语句中需要通过 findById() 才能查询)

文档新增

【save()】

  • 操作的是文档

  • Model.prototype.save([options], [options.safe], [options.validateBeforeSave], [fn])

  • 案例:

    var mongoose = require('mongoose')
    mongoose.connect('mongodb://localhost:27017/student',(err) => {
        if(!err){
            var schema = new mongoose.Schema({name:String,grades:Number})
            var stuModel = mongoose.model('grades',schema)
            //链式调用 通过new 一个Model创建一个 document
            new stuModel({name:"小明",grades:68}).save((err,docs) => {
                if(!err){
                    console.log(docs)
                    //{ _id: 6017bd1cf4cc8544d8ed2a8a, name: '小明', grades: 68, __v: 0 }
                }
            })
        }
    })
    

【create()】

  • 操作模型

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

  • 参数:

    [doc(s)]:文档对象或文档对象数组

    [callback]:回调函数

  • 案例:

    var mongoose = require('mongoose')
    mongoose.connect('mongodb://localhost:27017/student',(err) => {
        if(!err){
            var schema = new mongoose.Schema({name:String,grades:Number})
            var stuModel = mongoose.model('grades',schema)
            //链式调用 通过new 一个Model创建一个 document
            stuModel.create({name:"小明",grades:68},{name:"小红",grades:80},(err,doc1,doc2) => {
               if(!err){
                	console.log(doc1)
                	//{ _id: 6017be2d77c8dd01242624bb, name: '小明', grades: 68, __v: 0 }
                	console.log(doc2)
    				//{ _id: 6017be2d77c8dd01242624bc, name: '小红', grades: 80, __v: 0 }
            	}
            })
        }
    })
    

【insertMany()】

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

  • 返回值为一个数组

  • 案例:

    var mongoose = require('mongoose')
    mongoose.connect('mongodb://localhost:27017/student',(err) => {
        if(!err){
            var schema = new mongoose.Schema({name:String,grades:Number})
            var stuModel = mongoose.model('grades',schema)
            //链式调用 通过new 一个Model创建一个 document
            stuModel.insertMany({name:"小明",grades:68},{name:"小芳",grades:94},(err,docs) => {
               if(!err){
                	console.log(docs)
                	/*[{ _id: 6017befb5c36d64d08b72576, name: '小明', grades: 68, __v: 0 },
                       { _id: 6017befb5c36d64d08b72577, name: '小芳', grades: 94, __v: 0 }]*/
            	}
            })
        }
    })
    

文档查询

  • 数据表

    _idnamegrades__v
    6017befb5c36d64d08b72576小明680
    6017befb5c36d64d08b72577小芳940
    6017c455ba09d355a49ec8eb小红520
    6017c455ba09d355a49ec8ec小刚460

find()

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

  • 参数

    conditions:查询条件

    [projection]:控制返回字段

    [options]:配置查询参数

    [callback]:回调函数–function(err,docs){}

  • 案例:

    var mongoose = require('mongoose')
    mongoose.connect('mongodb://localhost:27017/student',(err) => {
        if(!err){
            var schema = new mongoose.Schema({name:String,grades:Number})
            var stuModel = mongoose.model('grades',schema)
            //查询所有数据
            stuModel.find((err,docs) => {
               if(!err){
                	console.log(docs)
            	}
            })        
           /* [{ _id: 6017befb5c36d64d08b72576, name: '小明', grades: 68, __v: 0 },
               { _id: 6017befb5c36d64d08b72577, name: '小芳', grades: 94, __v: 0 },
               { _id: 6017c455ba09d355a49ec8eb, name: '小红', grades: 52, __v: 0 },
               { _id: 6017c455ba09d355a49ec8ec, name: '小刚', grades: 46, __v: 0 }]*/
            
            //查询成绩大于60以上的数据
            stuModel.find({grades:{$gte:60}},(err,docs) => {
                if(!err){
                     console.log(docs)
                 }
             })
            /*[{ _id: 6017befb5c36d64d08b72576, name: '小明', grades: 68, __v: 0 },
               { _id: 6017befb5c36d64d08b72577, name: '小芳', grades: 94, __v: 0 }]*/
            
            //查询成绩大于60以上且名字里存在‘芳’的数据
            stuModel.find({name:/芳/,grades:{$gte:60}},(err,docs) => {
                if(!err){
                     console.log(docs)
                 }
             })
            /*[
            *     { _id: 6017befb5c36d64d08b72577, name: '小芳', grades: 94, __v: 0 }
            * ]*/
            
            //查询名字里存在‘明’的数据且只输出‘name’字段
            //_id默认会返回
            stuModel.find({name:/明/},{name:1,_id:0},(err,docs) => {
                if(!err){
                     console.log(docs)
                 }
             })
            // [{name: '小明'}]
            
            //找出跳过前两条数据的其他数据
            stuModel.find(null,null,{skip:2},(err,docs) => {
                if(!err){
                     console.log(docs)
                 }
             })
            /*[{ _id: 6017c455ba09d355a49ec8eb, name: '小红', grades: 52, __v: 0 },
               { _id: 6017c455ba09d355a49ec8ec, name: '小刚', grades: 46, __v: 0 }]*/
        }
    })
    

findById()

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

  • 案例:

    var mongoose = require('mongoose')
    mongoose.connect('mongodb://localhost:27017/student',(err) => {
        if(!err){
            var schema = new mongoose.Schema({name:String,grades:Number})
            var stuModel = mongoose.model('grades',schema)
            //保存查询数据的_id
            var aIDArr = []
            
            //查询所有数据
            stuModel.find((err,docs) => {
               if(!err){
                	docs.forEach((item,index,arr)=>{
                        aIDArr.push(item._id)
                    })
                    //显示第 0 个元素的所有字段
                    stuModel.findById(aIDArr[0],(err,doc)=>{
                        if(!err){
                            console.log(doc)
                        }
                    })
                   // { _id: 6017befb5c36d64d08b72576, name: '小明', grades: 68, __v: 0 }
                   
                    //显示第 0 个元素且只输出name字段
                    stuModel.findById(aIDArr[0],{name:1,_id:0},(err,doc)=>{
                        if(!err){
                            console.log(doc)
                        }
                    })
                   // { name: '小明' }
                   
                    //显示第 0 个元素且输出最少的字段(_id默认输出)
                    stuModel.findById(aIDArr[0],{lean:true},(err,doc)=>{
                        if(!err){
                            console.log(doc)
                        }
                    })
                   // { _id: 6017befb5c36d64d08b72576 }
            	}
            })
        }
    })
    

findOne()

  • 返回查询到的数据的第一个

  • Model.findOne([conditions], [projection], [options], [callback])

  • 案例:

    var mongoose = require('mongoose')
    mongoose.connect('mongodb://localhost:27017/student',(err) => {
        if(!err){
            var schema = new mongoose.Schema({name:String,grades:Number})
            var stuModel = mongoose.model('grades',schema)
            //找出age>20的文档中的第一个文档
            stuModel.findOne({grades:{$gt:80}},(err,doc) => {
               if(!err){
                	console.log(doc)
            	}
            })
            //{ _id: 6017befb5c36d64d08b72577, name: '小芳', grades: 94, __v: 0 }
    
            //找出age>20的文档中的第一个文档,且只输出name字段
            stuModel.findOne({grades:{$gt:80}},{name:1,_id:0},(err,doc) => {
                if(!err){
                     console.log(doc)
                 }
             })
             //{ name: '小芳' }
    
            //找出age>20的文档中的第一个文档,且输出包含name字段在内的最短字段
            stuModel.findOne({grades:{$gt:80}},{lern:true},(err,doc) => {
                if(!err){
                     console.log(doc)
                 }
             })
             //{ _id: 6017befb5c36d64d08b72577 }
        }
    })
    

复杂查询【$where】

  • $where 可以使用任意的 JavaScript 作为查询的一部分,包含JavaScript 表达式的字符串或者函数

  • 案例

    var mongoose = require('mongoose')
    mongoose.connect('mongodb://localhost:27017/student',(err) => {
        if(!err){
            var schema = new mongoose.Schema({name:String,grades:Number})
            //添加一个测试字段
            // schema.add({test:Number})
            var stuModel = mongoose.model('grades',schema)
            //添加两条数据
            // stuModel.create([{name:"小花",grades:76,test:76},{name:"小兰",grades:60,test:30}],(err,docs)=>{
            //     console.log(docs)
            // })
    
            //字符串 es5中this与obj指向一样,es6中只能用obj
            stuModel.find({$where:"this.grades == this.test" || "obj.grades == obj.test"},(err,doc) => {
               if(!err){
                	console.log(doc)
            	}
            })
            //[{_id: 6017d7cb8a95cb2a00aae3ae,name: '小花',grades: 76,test: 76,__v: 0}]
    
            //函数
            stuModel.find({$where:function() {
                return this.grades == this.test || obj.grades == obj.test*2
            }},(err,doc) => {
                if(!err){
                     console.log(doc)
                 }
             })
             /*[{_id: 6017d7cb8a95cb2a00aae3ae,name: '小花',grades: 76,test: 76,__v: 0},
                {_id: 6017d7cb8a95cb2a00aae3af,name: '小兰',grades: 60,test: 30,__v: 0}]*/
        }
    })
    

常用查询条件

$or     或关系

$nor    或关系取反

$gt     大于

$gte    大于等于

$lt     小于

$lte    小于等于

$ne     不等于

$in     在多个值范围内

$nin    不在多个值范围内

$all    匹配数组中多个值

$regex   正则,用于模糊查询

$size    匹配数组大小

$maxDistance  范围查询,距离(基于LBS)

$mod     取模运算

$near    邻域查询,查询附近的位置(基于LBS)

$exists   字段是否存在

$elemMatch  匹配内数组内的元素

$within    范围查询(基于LBS)

$box     范围查询,矩形范围(基于LBS)

$center    范围醒询,圆形范围(基于LBS)

$centerSphere 范围查询,球形范围(基于LBS)

$slice     查询字段集合中的元素(比如从第几个之后,第N到第M个元素

特定类型查询

  • 数据表

    _idnamegrades__vtest
    6017befb5c36d64d08b72576小明6801
    6017befb5c36d64d08b72577小芳9403
    6017c455ba09d355a49ec8eb小红5205
    6017c455ba09d355a49ec8ec小刚4602
    6017d7cb8a95cb2a00aae3ae小花7604
    6017d7cb8a95cb2a00aae3af小兰6006
方法
方法作用
sort排序
skip跳过
limit限制
select显示字段
exect执行
count计数
distinct去重
案例:
const mongoose = require('mongoose')
mongoose.connect('mongodb://localhost:27017/student')
var Schema =new mongoose.Schema({ name:String,grades:Number,test:{type:Number,default:0}})
var stuModel = mongoose.model('grades', Schema);

// 按test从小到大排序
stuModel.find().sort('test').exec((err,docs)=>{
  console.log(docs)
})
// 按test从大到小排列
stuModel.find().sort('-test').exec((err,docs)=>{
  console.log(docs)
})
// 跳过1个,显示其他
stuModel.find().skip(1).exec((err,docs)=>{
  console.log(docs)
})
// 显示2个
stuModel.find().limit(2).exec((err,docs)=>{
  console.log(docs)
})
// 显示name、grades字段,不显示_id字段
stuModel.find().select('name grades -_id').exec((err,docs)=>{
  console.log(docs)
})
// 跳过第1个后,只显示2个数据,按照grades由大到小排序,且不显示_id字段
stuModel.find().skip(1).limit(2).sort('-grades').select('-_id').exec((err,docs)=>{
  console.log(docs)
  /*[{ name: '小明', grades: 78, __v: 0, test: 1 },
     { name: '小花', grades: 76, test: 4, __v: 0 }]*/
})
// 显示集合stuModel中的文档数量
stuModel.find().count((err,count)=>{
  console.log(count)
  //6
})
// 返回集合stuModel中的grades的值
stuModel.find().distinct('grades',(err,distinct)=>{
  console.log(distinct)
  //[ 46, 52, 60, 76, 78, 94 ]
})

文档更新

update()

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

  • 参数

    conditions:查询条件

    doc:需要修改的数据(插入的数据)

    [options]:控制选项

    safe (boolean): 默认为true。安全模式。
    upsert (boolean): 默认为false。如果不存在则创建新记录。
    multi (boolean): 默认为false。是否更新多个查询记录。
    runValidators: 如果值为true,执行Validation验证。
    setDefaultsOnInsert: 如果upsert选项为true,在新建时插入文档定义的默认值。
    strict (boolean): 以strict模式进行更新。
    overwrite (boolean): 默认为false。禁用update-only模式,允许覆盖记录。

    [callback]:回调函数

  • 若设置了查询条件,当数据库不满足时默认什么也不发生

  • update() 方法中的回调函数不能省略,否则数据不会更新,当回调无有用信息时可以使用exec()简化

    stuModel.update({name:'小明'},{$set:{test:34}}.exec())
    
  • 案例

    //第一步,引入mongoose
    const mongoose = require('mongoose')
    //第二步,连接数据库
    mongoose.connect('mongodb://localhost:27017/student',err=>{
      if(!err){
        //第三步,创建模板
        var Schema =new mongoose.Schema({ name:String,grades:Number,test:{type:Number,default:0}})
        // var Schema = new Schema()
        //第四步,将模板映射到集合并创建
        var stuModel = mongoose.model('grades',Schema)
    
        //查询name为小明的数据,并将其test更改为34
        //若有多个文档,默认只更新第一个
        stuModel.update({name:'小明'},{$set:{test:34}},(err,raw)=>{
          console.log(raw)
        })
          
         //{ n: 1, nModified: 1, ok: 1 }
    	 //6017befb5c36d64d08b72576	小明	68	0	34
      }
    })
    

updateOne()

  • Model.updateOne(conditions, doc, [options], [callback])
  • 与update()相似,唯一区别为updateOne() 默认更新一个文档,即使设置{multi:true}也无法只更新一个文档

updateMany()

  • Model.updateMany(conditions, doc, [options], [callback])

  • 与update()相似,唯一区别为updateMany() 默认更新多个文档,即使设置{multi:false}也无法只更新一个文档

find()+save()

  • 用于复杂更新

    const mongoose = require('mongoose')
    mongoose.connect('mongodb://localhost:27017/student',err=>{
      if(!err){
         var Schema =new mongoose.Schema({ name:String,grades:Number,test:{type:Number,default:0}})
         var stuModel = mongoose.model('grades',Schema)
    	
         //查询成绩小于60的数据,并在其名字后添加‘:差生’字段
         stuModel.find({grades:{$lt:60}},(err,docs)=>{
          console.log(docs);
          /*[{test: 0,_id: 6017c455ba09d355a49ec8eb,name: '小红',grades: 52,__v: 0},
            {test: 0,_id: 6017c455ba09d355a49ec8ec,name: '小刚',grades: 46,__v: 0}]*/
          
          docs.forEach((item,index,arr) => {
            item.name += ':差生'
            //将修改后的数据保存
            item.save()
          })
          console.log(docs)
          /*[{test: 0,_id: 6017c455ba09d355a49ec8eb,name: '小红:差生',grades: 52,__v: 0},
            {test: 0,_id: 6017c455ba09d355a49ec8ec,name: '小刚:差生',grades: 46,__v: 0}]*/
        })
      }
    })
    

findOne() + save()

  • 用于复杂更新

  • findOne()返回值为文档对象

    const mongoose = require('mongoose')
    mongoose.connect('mongodb://localhost:27017/student',err=>{
      if(!err){
         var Schema =new mongoose.Schema({ name:String,grades:Number,test:{type:Number,default:0}})
         var stuModel = mongoose.model('grades',Schema)
    	
         //查询成绩小于60的数据,并在其名字后添加‘:差生’字段
         stuModel.findOne({name:'小明'},(err,doc)=>{
          console.log(doc);
          //[{test: 34,_id: 6017c455ba09d355a49ec8eb,name: '小明',grades: 68,__v: 0},
          doc.age += 10
          doc.save()
          console.log(docs)
          //[{test: 34,_id: 6017c455ba09d355a49ec8eb,name: '小明',grades: 78,__v: 0}
        })
      }
    })
    

fingOneAndUpdate()

  • Model.findOneAndUpdate([conditions], [update], [options], [callback])

findByIdAndUpdate()

  • Model.findByIdAndUpdate([conditions], [update], [options], [callback])

文档删除

【remove()】

  • 会删除符合条件的所有数据

  • Model的remove()

    const mongoose = require('mongoose')
    mongoose.connect('mongodb://localhost:27017/student',err=>{
      if(!err){
         var Schema =new mongoose.Schema({ name:String,grades:Number,test:{type:Number,default:0}})
         var stuModel = mongoose.model('grades',Schema)
         //删除名字中包含‘差生’的数据
    	 stuModel.remove({name:/差生/},function(err){})
         // 回调函数不能省略,但可以使用exec() 简写
         //stuModel.remove({name:/差生/}).exec()
        })
      }
    })
    
  • 文档的remove()

    const mongoose = require('mongoose')
    mongoose.connect('mongodb://localhost:27017/student',err=>{
      if(!err){
         var Schema =new mongoose.Schema({ name:String,grades:Number,test:{type:Number,default:0}})
         var stuModel = mongoose.model('grades',Schema)
         //删除名字中包含‘差生’的数据
    	 stuModel.find({name:/差生/},function(err,docs){
             docs.forEach((item,index,arr)=>{
                 item.remove((err,doc)=>{
                     //doc为被删除的值
                     console.log(doc)
                 })
             })
         })
        })
      }
    })
    

【findOneAndRemove()】

  • 删除符合条件的一条数据

  • Model.findOneAndRemove(conditions, [options], [callback])

  • 回调不可省略,但可以使用exec() 简写

    stuModel.findOneAndRemove({name:/差生/}).exec()
    

【findByIdAndRemove()】

  • 通过id删除数据(id是唯一的)
  • Model.findByIdAndRemove(conditions, [options], [callback])
  • 回调不可省略,但可以使用exec() 简写

前后钩子

  • 前后钩子即 pre() 和 post() 方法(中间件)

  • 中间件在schema上指定,类似静态方法或实例方法等

  • 可以在执行以下操作时设置前后钩子

    ​ init
    ​ validate
    ​ save
    ​ remove
    ​ count
    ​ find
    ​ findOne
    ​ findOneAndRemove
    ​ findOneAndUpdate
    ​ insertMany
    ​ update

  • 【pre()】:在执行某些操作前执行

  • 【post】:在执行某些操作前后执行,不可以使用next()

案例:

const mongoose = require('mongoose')
mongoose.connect('mongodb://localhost:27017/student')
var Schema =new mongoose.Schema({ name:String,grades:Number,test:{type:Number,default:0}})
Schema.pre('find',function(next){
    console.log('我是pre方法1');
    next();
});
Schema.pre('find',function(next){
    console.log('我是pre方法2');
    next();
});
Schema.post('find',function(docs){
  console.log('我是post方法1');
});
Schema.post('find',function(docs){
  console.log('我是post方法2');
});  
var stuModel = mongoose.model('grades', Schema);
stuModel.find(function(err,docs){
    console.log(docs[0]);
})    
/*
我是pre方法1
我是pre方法2
我是post方法1
我是post方法2
{test: 34, _id: 6017befb5c36d64d08b72576,name: '小明',grades: 78,__v: 0}
*/

文档验证

  • 保证保存文档时,可以按照Schema设置的字段进行设置

【required】:数据必填

//将name设置为必填字段,如果没有name字段,文档将不被保存,且出现错误提示
const mongoose = require('mongoose')
mongoose.connect('mongodb://localhost:27017/student')
var Schema =new mongoose.Schema({
  name:{
    type:String,
    required:true
  },
  age:Number
})
var stuModel = mongoose.model('students', Schema);
new stuModel({age:20}).save((err,doc)=>{
  if(err){
    return console.log(err)
  }
  console.log(doc)
})

//报错:name: Path `name` is required.

【default】:默认值

//设置age字段的默认值为18,如果不设置age字段,则会取默认值
const mongoose = require('mongoose')
mongoose.connect('mongodb://localhost:27017/student')
var Schema =new mongoose.Schema({
  name:String,
  age:{
    type:Number,
    default:18
  }
})
var stuModel = mongoose.model('students', Schema);
new stuModel({name:'李雷'}).save((err,doc)=>{
  if(err){
    return console.log(err)
  }
  console.log(doc)
})

//{ age: 18, _id: 6018f3bd7e51343e6c4f212b, name: '李雷', __v: 0 }

【min】【max】:最小/大值

  • 只适用于数字
//将age的取值范围设置为[0,10]。如果age取值为20,文档将不被保存,且出现错误提示
const mongoose = require('mongoose')
mongoose.connect('mongodb://localhost:27017/student')
var Schema =new mongoose.Schema({
  name:String,
  age:{
    type:Number,
    min:10,
    max:18
  }
})
var stuModel = mongoose.model('students', Schema);
new stuModel({name:'李雷',age:20}).save((err,doc)=>{
  if(err){
    return console.log(err)
  }
  console.log(doc)
})

//age: Path `age` (20) is more than maximum allowed value (18).

【match】:正则匹配

  • 只适用于字符串
//将name的match设置为必须存在'01'字符。如果name不存在'01',文档将不被保存,且出现错误提示
const mongoose = require('mongoose')
mongoose.connect('mongodb://localhost:27017/student')
var Schema =new mongoose.Schema({
  name:{type:String,match:/01/},
  age:Number,
})
var stuModel = mongoose.model('students', Schema);
new stuModel({name:'李雷',age:20}).save((err,doc)=>{
  if(err){
    return console.log(err)
  }
  console.log(doc)
})

//name: Path `name` is invalid (李雷).

【enum】:枚举匹配

  • 只适用于字符串
//将name的枚举取值设置为['zs','ls','ww'],如果name不在枚举范围内取值,文档将不被保存,且出现错误提示
const mongoose = require('mongoose')
mongoose.connect('mongodb://localhost:27017/student')
var Schema =new mongoose.Schema({
  name:{type:String,enum:['zs','ls','ww']},
  age:Number,
})
var stuModel = mongoose.model('students', Schema);
new stuModel({name:'lss',age:20}).save((err,doc)=>{
  if(err){
    return console.log(err)
  }
  console.log(doc)
})

//name: ValidatorError: `lss` is not a valid enum value for path `name`.

【validate】:自定义匹配

  • validate实际上是一个函数,函数的参数代表当前字段,返回true表示通过验证,返回false表示未通过验证
//定义名字name的长度必须在4个字符以上
const mongoose = require('mongoose')
mongoose.connect('mongodb://localhost:27017/student')
var Schema =new mongoose.Schema({
  name:{type:String,validate:nameLength},
  age:Number,
})
var stuModel = mongoose.model('students', Schema);
new stuModel({name:'abcd',age:20}).save((err,doc)=>{
  if(err){
    return console.log(err)
  }
  console.log(doc)
})

function nameLength(arg){
  if(arg.length>4){
    return true
  }
  return false
}

//name: Validator failed for path `name` with value `abcd`

联表操作

localhost:27017/student’)
var Schema =new mongoose.Schema({
name:{type:String,enum:[‘zs’,‘ls’,‘ww’]},
age:Number,
})
var stuModel = mongoose.model(‘students’, Schema);
new stuModel({name:‘lss’,age:20}).save((err,doc)=>{
if(err){
return console.log(err)
}
console.log(doc)
})

//name: ValidatorError: lss is not a valid enum value for path name.


### 【validate】:自定义匹配

* validate实际上是一个函数,函数的参数代表当前字段,返回true表示通过验证,返回false表示未通过验证

```javascript
//定义名字name的长度必须在4个字符以上
const mongoose = require('mongoose')
mongoose.connect('mongodb://localhost:27017/student')
var Schema =new mongoose.Schema({
  name:{type:String,validate:nameLength},
  age:Number,
})
var stuModel = mongoose.model('students', Schema);
new stuModel({name:'abcd',age:20}).save((err,doc)=>{
  if(err){
    return console.log(err)
  }
  console.log(doc)
})

function nameLength(arg){
  if(arg.length>4){
    return true
  }
  return false
}

//name: Validator failed for path `name` with value `abcd`

联表操作

  • 74
    点赞
  • 366
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
Mongoose中,create方法用于创建新的文档。通过定义一个Mongoose模型,可以使用create方法来创建一个新的文档。例如,可以使用如下代码创建一个名为User的模型,并使用create方法创建一个名为doc的新文档,其中文档中的name字段为'O.O': ```javascript const User = mongoose.model('User', mongoose.Schema({ name: String })) const doc = await User.create({ name: 'O.O' }) console.log(doc instanceof User) // true console.log(doc.name) // 'O.O' ``` 以上代码中,首先定义了一个名为User的模型,该模型具有一个name字段,然后通过create方法创建了一个新的文档,并将其赋给了名为doc的变量。最后,我们可以通过doc.name来获取新文档中的name字段的值。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Mongoose基础入门](https://blog.csdn.net/u010142437/article/details/79218145)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [Mongoose create() 方法](https://blog.csdn.net/weixin_46267040/article/details/125369782)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值