1 MongoDB原生CRUD(增删改查)命令总结

-C creat(新增数据):

db.集合名.insert(文档对象)
db.集合名.insertOne(文档对象)
db.集合名.insertMany([文档对象,文档对象])

-R read:

db.集合名.find(查询条件[,投影])
    举例:db.students.find({age:18}),查找年龄为18的所有信息
    举例:db.students.find({age:18,name:'jack'}),查找年龄为18且名字为jack的学生
    
常用操作符:
    1. < , <= , > , >= , !==   对应为: $lt $lte $gt $gte $ne
        举例:db.集合名.find({age:{$gte:20}}),年龄是大于等于20的
    2.逻辑或:使用$in 或 $or
        查找年龄为18或20的学生
        举例:db.students.find({age:{$in:[18,20]}})
        举例:db.students.find({$or:[{age:18},{age:20}]})
    3.逻辑非:$nin
    4.正则匹配:
        举例:db.students.find({name:/^T/})
    5.$where能写函数:
        db.students.find({$where:function(){
            return this.name === 'zhangsan' && this.age === 18
        }})
            
投影:过滤掉不想要的数据,只保留想要展示的数据
    举例:db.students.find({},{_id:0,name:0}),过滤掉id和name
    举例:db.students.find({},{age:1}),只保留age
    
补充:db.集合名.findOne(查询条件[,投影]),默认只要找到一个

-U update:

db.集合名.update(查询条件,要更新的内容[,配置对象])
    
//如下写法会将更新内容替换掉整个文档对象,但_id不受影响
    举例:db.students.update({name:'zhangsan'},{age:19})
    
//使用$set修改指定内容,其他数据不变,不过只能匹配一个zhangsan
    举例:db.students.update({name:'zhangsan'},{$set:{age:19}})
    
//修改多个文档对象,匹配多个zhangsan,把所有zhangsan的年龄都替换为19
    举例:db.students.update({name:'zhangsan'},{$set:{age:19}},{multi:true})
    
 补充:db.集合名.updateOne(查询条件,要更新的内容[,配置对象])
      db.集合名.updateMany(查询条件,要更新的内容[,配置对象])

-D delete

db.集合名.remove(查询条件)
    //删除所有年龄小于等于19的学生
    举例:db.students.remove({age:{$lte:19}})
/*
* mongoDB:一个数据库品牌的名字
* mongod:启动数据库的命令
* mongo:连接接数据库的命令
* mongoose:在Node平台下,一个知名的用于帮助开发者连接mongoDB的包
* */
//为什么用mongoose? 想在Node平台下,更加简单、高效、安全、稳定的操作mongoDB
//当引入第三方库的时候,如果在本文件夹内没有找到node_modules,找外层文件夹,直到根目录

//引入mongoose
let mongoose = require('mongoose')

//1.连接数据库
mongoose.connect('mongodb://localhost:27017/demo',{
  useNewUrlParser: true, //使用一个新的URL解析器,用于解决一些安全性问题。
  useUnifiedTopology: true //使用一个统一的新的拓扑结构
})

//2.绑定数据库连接的监听
mongoose.connection.on('open',function (err) {
  if(err){
    console.log('数据库连接失败',err)
  }else{
    console.log('数据库连接成功')
    //3.操作数据库
    console.log('操作数据库')
  }
})

2 mongoose原生CRUD(增删改查)命令总结

-Create

模型对象.create(文档对象,回调函数)

-Read

模型对象.find(查询条件[,投影],回调函数)不管有没有数据,都返回一个数组
   模型对象.findOne(查询条件[,投影],回调函数)找到了返回一个对象,没找到返回null

-Update

模型对象.updateOne(查询条件,要更新的内容[,配置对象],回调函数)
  模型对象.updateMany(查询条件,要更新的内容[,配置对象],回调函数)
  备注:存在update方法,但是即将废弃,查询条件匹配到多个时,依然只修改一个,强烈建议用updateOne或updateMany

-Delete

模型对象.deleteOne(查询条件,回调函数)
   模型对象.deleteMany(查询条件,回调函数)
   备注:没有delete方法,会报错!

备注: 以上所有方法,如果没有指定回调函数,则返回值是一个Promise的实例

//引入mongoose
let mongoose = require('mongoose')
mongoose.set('useCreateIndex',true) //使用一个新的索引创建器

//1.连接数据库
mongoose.connect('mongodb://localhost:27017/demo',{
  useNewUrlParser: true, //使用一个新的URL解析器,用于解决一些安全性问题。
  useUnifiedTopology: true //使用一个统一的新的拓扑结构。
})

//2.绑定数据库连接的监听
mongoose.connection.on('open',function (err) {
  if(err){
    console.log('数据库连接失败',err)
  }else{
    console.log('数据库连接成功')
    //3.操作数据库

    //把数据库想象成你家的别墅

    //1.请来一个帮你看门的保安 ------ 引入模式对象
    let Schema = mongoose.Schema

    //2.制定进入你家的规则 --------  创建约束对象
    let studentsRule = new Schema({
      stu_id:{
        type:String, //限制学号必须为:字符串
        required:true,
        unique:true
      },
      name:{
        type:String, //限制姓名必须为:字符串
        required:true, //限制姓名为必填项
      },
      age:{
        type:Number, //限制年龄必须为:字符串
        required:true, //限制年龄为必填项
      },
      sex:{
        type:String, //限制性别必须为:字符串
        required:true, //限制性别为必填项
      },
      hobby:[String], //限制爱好只能为数组,数组中的每一项必须为字符串
      info:Schema.Types.Mixed, //接收所有类型
      date:{
        type:Date,
        default:Date.now()
      },
      enable_flag:{
        type:String,
        default:'Y'
      }
    })

    //3.告诉保安你的规则 ------- 创建模型对象
    let stuModel = mongoose.model('students',studentsRule) //用于生成某个集合所对应的模型对象

    //4.真正有人要进入你家了 -------- CRUD

    //新增操作 --- C
    stuModel.create({
      stu_id:'004',
      name:'强',
      age:'42',
      sex:'男',
      hobby:['女','打代码','打篮球'], //限制爱好只能为数组,数组中的每一项必须为字符串
      info:'一个风一样的男子', //接收所有类型
    },function(err,data){
        if (!err) console.log(data)
        else console.log(err)
    })

    //查询 --- R
    /*find方法:
        1.返回的是一个数组,就算是一条数据,也包裹一个数组
        2.若查询结果为空,则返回一个空数组。
    */
    /*stuModel.find({name:'金龙老师'},function (err,data) {
      if (!err) console.log(data)
      else console.log(err)
    })*/
    /*find方法:
        1.若有结果,返回的是一个对象
        2.若没有结果,返回一个null
    */
    /*stuModel.findOne({name:'班长'},{age:1,_id:0},function (err,data) {
      if (!err) console.log(data)
      else console.log(err)
    })*/

    //更新 --- U
    /*stuModel.updateOne({name:'静静'},{age:16},function (err,data) {
      if (!err) console.log(data)
      else console.log(err)
    })*/

    //删除 --- D
    /*stuModel.deleteMany({age:16},function (err,data) {
      if (!err) console.log(data)
      else console.log(err)
    })*/
  }
})

3 mongoose模块化

文件结构:

--demo
         --db
                 --db.js
         --model
                 --studentModel.js
                 --teacherModel.js
         --app.js

核心要义:将整个分为:数据库连接(及监听)+创建模型对象(模式对象–约束对象–模型对象)+通过模型对象的方法实现CRUD

  • 数据库连接(及监听) demo/db/db.js
/*
* 该模块主要用于连接数据库,且判断数据库的连接状态
* */
let mongoose = require('mongoose')
mongoose.set('useCreateIndex',true) //使用一个新的索引创建器

const DB_NAME = 'demo'
const PORT = 27017
const IP = 'localhost'

function connectMongo(callback) {
  //1.连接数据库
  mongoose.connect(`mongodb://${IP}:${PORT}/${DB_NAME}`,{
    useNewUrlParser: true, //使用一个新的URL解析器,用于解决一些安全性问题。
    useUnifiedTopology: true //使用一个统一的新的拓扑结构。
  })

  //2.绑定数据库连接的监听
  mongoose.connection.on('open',function (err) {
    if(err){
      console.log('数据库连接失败',err)
      callback('connect failed')
    }else{
      console.log('数据库连接成功')
      callback()
    }
  })
}

module.exports = connectMongo
  • 创建模型对象(模式对象–约束对象–模型对象)
        demo>model>studentModel.js
//把数据库想象成你家的别墅
let mongoose = require('mongoose')

//1.请来一个帮你看门的保安 ------ 引入模式对象
let Schema = mongoose.Schema

//2.制定进入你家的规则 --------  创建约束对象
let studentsRule = new Schema({
  stu_id:{
    type:String, //限制学号必须为:字符串
    required:true,
    unique:true
  },
  name:{
    type:String, //限制姓名必须为:字符串
    required:true, //限制姓名为必填项
  },
  age:{
    type:Number, //限制年龄必须为:字符串
    required:true, //限制年龄为必填项
  },
  sex:{
    type:String, //限制性别必须为:字符串
    required:true, //限制性别为必填项
  },
  hobby:[String], //限制爱好只能为数组,数组中的每一项必须为字符串
  info:Schema.Types.Mixed, //接收所有类型
  date:{
    type:Date,
    default:Date.now()
  },
  enable_flag:{
    type:String,
    default:'Y'
  }
})

//3.告诉保安你的规则 ------- 创建模型对象
module.exports = mongoose.model('students',studentsRule) //用于生成某个集合所对应的模型对象

    demo>model>teacherModel.js

//把数据库想象成你家的别墅
let mongoose = require('mongoose')

//1.请来一个帮你看门的保安 ------ 引入模式对象
let Schema = mongoose.Schema

//2.制定进入你家的规则 --------  创建约束对象
let teachersRule = new Schema({
  teac_id:{
    type:String, //限制学号必须为:字符串
    required:true,
    unique:true
  },
  name:{
    type:String, //限制姓名必须为:字符串
    required:true, //限制姓名为必填项
  },
  age:{
    type:Number, //限制年龄必须为:字符串
    required:true, //限制年龄为必填项
  },
  sex:{
    type:String, //限制性别必须为:字符串
    required:true, //限制性别为必填项
  },
  hobby:[String], //限制爱好只能为数组,数组中的每一项必须为字符串
  info:Schema.Types.Mixed, //接收所有类型
  date:{
    type:Date,
    default:Date.now()
  },
  enable_flag:{
    type:String,
    default:'Y'
  }
})

//3.告诉保安你的规则 ------- 创建模型对象
module.exports = mongoose.model('teachers',teachersRule) //用于生成某个集合所对应的模型对象
  • 通过模型对象的方法实现CRUD demo>app.js
//1.引入mongoose库
let mongoose = require('mongoose')
//2.引入数据库连接模块
let db = require('./db/db')
//3.引入学生模型
let stuModel = require('./model/studentModel')
//引入老师模型
let teacModel = require('./model/teacherModel')


//判断数据的连接状态,若成功,CRUD
//判断数据的连接状态,若失败,报告错误

db(function(err){
  if (err) console.log(err)
  else{
    //真正进行CRUD
    stuModel.create({
      stu_id:'002',
      name:'小王八',
      age:'24',
      sex:'男',
      hobby:['女','打代码','打游戏'], //限制爱好只能为数组,数组中的每一项必须为字符串
      info:'一个二比一样的男子', //接收所有类型
    },function(err,data){
      if (!err) console.log(data)
      else console.log(err)
    })


  }
})