Mongoose基本使用

mongoDB数据库笔记

数据库(摘自百度百科)

  • 数据库(database)是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。

  • 数据库是以一定方式储存在一起、能与多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合,可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据进行新增、查询、更新、删除等操作。

  • 数据库是一个按数据结构来存储和管理数据的计算机软件系统。数据库的概念实际包括两层意思

    1. 数据库是一个实体,它是能够合理保管数据的“仓库”,用户在该“仓库”中存放要管理的事务数据,“数据”和“库”两个概念结合成为数据库。

    2. 数据库是数据管理的新方法和技术,它能更合适的组织数据、更方便的维护数据、更严密的控制数据和更有效的利用数据。


  • 在一个数据库软件中可以包含多个数据仓库(database),在每个数据仓库中可以包含多个数据集合(collection,类似JavaScript中的集合),每个数据集合中可以包含多条文档(document,类似JavaScript中的对象)(具体的数据)。字段(filed,类似JavaScript中对象的属性)

Mongoose

  • node操作mongodb需要借助mongoose模块

  • net start/stop XXX (启动/停止 指定服务)

  • 连接数据库

    const mongoose = require('mongoose');
    
    mongoose.connect('mongodb://localhost/people', {useNewUrlParser: true, useUnifiedTopology: true})
        .then( () => {console.log('数据库连接成功!')} )
        .catch( (error) => {console.log(error)} );
    
    • 在mongodb中若连接的数据库不存在将会自动的创建
  • 增删改查

    • 创建集合规则

      const peopleSchema = new mongoose.Schema
      (
          {
              name: String,
              age: Number,
              mark: Boolean
          }
      )
      
    • 使用规则创建集合

      const People = mongoose.model('People', peopleSchema);
      
      • 这里的People集合实际对应的名称为peoples,规定集合首字母大写
      • 该方法的返回值为一个集合构造函数
      • 创建空的集合将不会显示在campase中
    • 创建文档(插入数据)

      • 创建实例对象

        const peopleSchema = new mongoose.Schema
        (
            {
                name: String,
                age: Number,
                hobby: [String],
                mark: Boolean
            }
        )
        
      • 保存

        people1.save();
        
      • 创建完成后数据库将会自动生成一个_id字段,该字段为该条数据的唯一标识

    • 插入文档的另一种方式

      People.create
      ( 
          {name: '小红', age: 14, hobby: ['烫头', '编程'], mark: false}, 
        	(error, result) => { console.log(error);console.log(result); } 
      )
      
      
      • 回调函数中的参数第一个为错误对象,第二个为插入成功的对象

      • 数据库的操作均为异步操作(该方法返回值也是一个promise对象)

        People.create( {name: '小刚', age: 13, hobby: ['烫头', '编程'], mark: true} )
            .then( (result) => {console.log(result);} )
            .catch( (error) => {console.log(error);} )
        
    • 向mongodb中批量添加文档

      • 在其安装目录下的bin目录中的mongoimport.exe可执行文件将其配置好环境变量,使用命令 mongoimport -d 指定数据库 -c 指定集合 --file 数据文件路径
    • 查询文档

      • 不指定查询规则查询所有文档

        People.find().then( (result) => { console.log(result); } );
        
      • find查询结果总会是一个数组,数组中包含一个个的对象(也就是文档)

        [
          {
            hobby: [ '烫头', '编程' ],
            _id: 5eb77027ce6e3c2cc44a25e7,
            name: '小刚',
            age: 13,
            mark: true,
            __v: 0
          },
          {
            hobby: [ 'LOL', 'qq飞车' ],
            _id: 5eb77027ce6e3c2cc44a25e8,
            name: '小明',
            age: 12,
            mark: true,
            __v: 0
          },
          {
            hobby: [ 'CF', '跳舞' ],
            _id: 5eb77027ce6e3c2cc44a25e9,
            name: '小米',
            age: 14,
            mark: false,
            __v: 0
          }
        ]
        
      • 根据指定id查找指定文档

        People.find({_id: '5eb77027ce6e3c2cc44a25e7'})
        	.then( (result) => { console.log(result); } );
        
      • 使用 findOne() 来仅查询一个符合条件的文档,若无条件限制则为第一条文档,且查询结果为一个对象

      • 查询某个值在一定范围的文档

        People.find({age: {$gt: 15, $lt: 30}}) // gt大于,lt小于
        	.then( (result) => { console.log(result); } );
        
      • 查询某个值包含特定值的文档

        People.find({hobby: {$in: ['LOL']}})
        	.then( (result) => { console.log(result); } );
        
      • 查询指定文档的指定字段,结果为一个数组

        People.find({hobby: {$in: ['LOL']}})
        	.select('name age -_id') //不查询某字段在其前面添加-
        	.then( (result) => { console.log(result); } );
        
      • 根据某一数值字段进行升序排列(降序的sort参数为 -XXX)

        People.find().sort('age').then( (result) => { console.log(result); } );
        
      • 跳过指定条数据(skip(X))并限制查询数据的条数(limit(X))

        People.find().skip(1).limit(1).then( (result) => { console.log(result); } );
        
    • 删除一条指定条件的文档(若匹配到多个则删除第一个)

      People.findOneAndDelete({name: '小明'})
      	.then( (result) => { console.log(result); } );
      
      • 结果为删除的文档
    • 删除多个文档

      People.deleteMany({···})
      	.then( (result) => { console.log(result); } );
      
      • 删除结果为{ n: X, ok: X }(n:删除文档条数,ok:是否成功完成)
    • 更新文档

      • 更新指定的某条文档

        People.updateOne({name: '小米'}, {name: '小小米'})
        	.then( (result) => { console.log(result); } );
        
      • 结果为{ n: 1, nModified: 1, ok: 1 }

      • 更新多条文档

        People.updateMany({···}, {···})
        	.then( (result) => { console.log(result); } );
        
      • 结果为{ n: X, nModified: X, ok: 1 }

  • 验证

    • 在创建集合规则的时候,可以设置当前字段的验证规则,验证失败就会录入数据失败

      const studentSchema = new mongoose.Schema
      (
          {
              name: 
              { 
                  type: String, 
                  required: [true, '自定义错误信息'], 
                  minlength: 3,
                  maxlength: 5,
                  trim:true,
              },
              age:
              {
              	type: Number,
              	min: 18,
              	max: 30,
          	},
          	birthday:
          	{
          		type: Date,
          		default: Date.now,
          	},
          	sex:
              {
                  type: String,
                  enum: 
                  {
                      ['男', '女'],
                      message: '选填男或者女', //自定义错误信息
                  },
              },
              mark:
              {
              	type: String,
                  validate: 
                  {
                      validator: function(value){ return value && value.length>5 },
                      message: '自定义错误信息',
                  },
        	}   
          }
      

    )

    
    - required:该字段是否必须
    
    - minlength:字符串最小长度;maxlength:最大长度(同样后面可以以数组的方式传入错误提示信息)
    
    - trim:是否去除传入字符串两端的空格
    
    - max:最大数值;min:最小数值
    
    - default:设置默认值
    
    - enum:可选值
    
    - validate:自定义验证规则
    
    - validator:自定义验证器, 值为一个函数且形参为当前字段设置的值,且函数返回值为布尔值,根据其返回值判定验证是否通过
    
    - message:自定义错误信息 
    
    

获取错误信息

  • 集合构造函数返回值为一个promise对象所以可以使用catch方法来获取错误信息

  • 错误信息实例

    Error [ValidationError]: Student validation failed: mark: 验证失败
        at ValidationError.inspect (D:\node和mongodb\代码\node_modules\mongoose\lib\error\validation.js:61:24)
        at formatValue (internal/util/inspect.js:693:31)
        at inspect (internal/util/inspect.js:264:10)
        at formatWithOptions (internal/util/inspect.js:1865:40)
        at Object.Console. (internal/console/constructor.js:281:10)
        at Object.log (internal/console/constructor.js:291:61)
        at D:\node和mongodb\代码\app2.js:24:100
        at processTicksAndRejections (internal/process/task_queues.js:97:5) {
      errors: {
        mark: MongooseError [ValidatorError]: 验证失败
            at new ValidatorError (D:\node和mongodb\代码\node_modules\mongoose\lib\error\validator.js:29:11)
            at validate (D:\node和mongodb\代码\node_modules\mongoose\lib\schematype.js:1178:13)
            at D:\node和mongodb\代码\node_modules\mongoose\lib\schematype.js:1161:7
            at Array.forEach ()
            at SchemaNumber.SchemaType.doValidate (D:\node和mongodb\代码\node_modules\mongoose\lib\schematype.js:1106:14)
            at D:\node和mongodb\代码\node_modules\mongoose\lib\document.js:2378:18
            at processTicksAndRejections (internal/process/task_queues.js:79:11) {
          message: '验证失败',
          name: 'ValidatorError',
          properties: [Object],
          kind: 'user defined',
          path: 'mark',
          value: 2,
          reason: undefined,
          [Symbol(mongoose:validatorError)]: true
        }
      },
      _message: 'Student validation failed',
      name: 'ValidationError'
    }
    
    • 整体上是一个错误对象,内部包含一个或者多个验证失败的字段
  • 获取自定义错误信息

        .catch( (error) => { const errors = error.errors; for(let i in errors){ console.log(errors[i]['message']) } } );
    

集合关联

  • 将需要关联其他集合的字段设置其指定的属性

            XXX: // 需要关联集合的字段
            {
                type: mongoose.Schema.Types.ObjectId,
                ref: 'XXX', //关联的集合
            }
    
    • 在指定该字段的值时,需要添加对应的id
  • 查询关联的数据

    Student.find().populate('关联字段').then( (result) => { console.log(result); } );
    

你可能感兴趣的:(Mongoose基本使用)