nodejs+mongodb笔记------第三章(mongodb数据库增删改查、模型对象、node服务器搭建)

mongodb数据库

数据库概述及环境搭建

为什么要使用数据库

  • 动态网站中的数据都是存储在数据库中的

  • 数据库可以用来持久存储客户端通过表单收集的用户信息

  • 数据库软件本身可以对数据进行高效的管理

什么是数据库

数据库即存储数据的仓库,可以将数据进行有序的分门别类的存储。它是独立于语言之外的软件,可以通过API去操作它。

常见的数据库软件有:mysql、mongoDB、oracle。

MongoDB数据库下载安装

下载地址:https://www.mongodb.com/download-center

MongoDB可视化软件

MongoDB可视化操作软件,是使用图形界面操作数据库的一种方式。

数据库相关概念

在一个数据库软件中可以包含多个数据仓库,在每个数据仓库中可以包含多个数据集合,每个数据集合中可以包含多条文档(具体的数据)

关于端口号的总结

端口号:1--65535,不建议使用1--199的端口号,这些是预留给系统的,一般使用4位的,4位的也不要用1开头的。

常见端口号:
    21端口:FTP 文件传输服务
    22端口:SSH 端口
    23端口:TELNET 终端仿真服务
    25端口:SMTP 简单邮件传输服务
    53端口:DNS 域名解析服务
    80端口:HTTP 超文本传输服务
    110端口:POP3 “邮局协议版本3”使用的端口
    443端口:HTTPS 加密的超文本传输服务
    1433端口:MS SQL*SERVER数据库 默认端口号
    1521端口:Oracle数据库服务
    1863端口:MSN Messenger的文件传输功能所使用的端口
    3306端口:MYSQL 默认端口号
    3389端口:Microsoft RDP 微软远程桌面使用的端口
    5631端口:Symantec pcAnywhere 远程控制数据传输时使用的端口
    5632端口:Symantec pcAnywhere 主控端扫描被控端时使用的端口
    5000端口:MS SQL Server使用的端口
    27017端口:MongoDB实例默认端口

MongoDB连接本地数据库

在mongodb安装所在目录bin目录下执行 mongo --host=127.0.0.1 --port=27017 

MongoDB基本命令

1. db : 查看当前在操作哪一个数据库
2. show dbs :查看数据库列表(一共有几个数据库,备注:如果数据库为空,不出现在列表中)
3. use test :切换到test数据库,如果不存在,则创建一个test库
4. db.students.insert({}) :向当前数据库的students集合中插入一个文档。
5. show collections :展示当前数据库中所有的集合。

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}})

mongoose的基本使用

/*
 * mongoDB:一个非关系型数据库的名称
 * mongod:启动mongo服务的命令
 * mongo:连接数据库的命令
 * mongoose:在Node端连接数据库的一个框架
 * */

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

let dbPromise = new Promise((resolve, reject) => {
  //2.连接数据库
  mongoose.connect('mongodb://localhost:27017/demo', {
    useNewUrlParser: true,
    useUnifiedTopology: true
  })

  //3.监听连接状态
  mongoose.connection.on('open', (err) => {
    if (!err) {
      console.log('数据库连接成功了!')
      resolve()
    } else {
      reject(err)
    }
  })
})

//第一种写法
/*dbPromise.then(()=>{
  //4.操作数据库的代码
  console.log(1)
},(err)=>{
  console.log(err)
})*/

//第二种写法
/*dbPromise
  .then(()=>{
    //4.操作数据库的代码
    console.log(1)
  }).catch((err)=>{
    console.log(err)
  })*/

//第三种写法
;
(async () => {
  //等待数据库连接成功
  await dbPromise

  //4.操作数据库的代码
  console.log(1)
})()

mongoose的CRUD操作

//引入mongoose
let mongoose = require('mongoose')
mongoose.set('useCreateIndex',true)
//定义数据库名
const DB_NAME = 'demo'
//定义数据库地址
const DB_URL = 'localhost:27017'
//构建一个Promise实例,用于管理数据库连接
let dbPromise = new Promise((resolve,reject)=>{
    //2.连接数据库
    mongoose.connect(`mongodb://${DB_URL}/${DB_NAME}`,{useNewUrlParser:true,useUnifiedTopology: true})

    //3.监听连接状态
    mongoose.connection.on('open',(err)=>{
      if(!err){
        console.log('数据库连接成功了!')
        resolve()
      }else{
        reject(err)
      }
    })
  })

//具体业务逻辑
;(async()=>{
  //等待数据库连接成功
  await dbPromise

  //操作数据库
  //1.请来一个保安 ------- 引入约束Schema
  let Schema = mongoose.Schema

  //2.制定一个进入你家的规则 -------- 创建一个约束对象实例
  let studentSchema = 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:{
      type:Schema.Types.Mixed //接收所有类型
    },
    date:{
      type:Date,
      default:Date.now()
    },
    enable_flag:{
      type:String,
      default:'Y' //默认启用该用户
    }
  })

  /*3.告诉保安你的规则 ------- 创建模型对象
  第一个参数与数据库中的集合相对应,第二个参数指定约束对象实例
  只要生成了模型对象,就可以进行数据的:增删改查*/
  let studentModel = mongoose.model('students',studentSchema)

  //4.操作数据库(增删改查)

  //新增数据
  /*let createResult = await studentModel.create({
    stu_id:'20190722004',
    name:'zhanchujin',
    age:22,
    sex:'男',
    hobby:['打代码','吃饭','睡觉'],
    info:'一个非常帅气的男人',
  })
  console.log(createResult);*/

  //查询数据库
  /*studentModel.findOne({age:90},{name:1,_id:0},(err,data)=>{
      if(!err){
        console.log(data)
      }else{
        console.log(err)
      }
  })*/

  //更新数据
  /*let updateResult = await studentModel.updateMany({age:90},{sex:'男'},{multi:true})
  console.log(updateResult);*/

  //删除数据
  /*await studentModel.deleteMany({age:90})*/
})()

mongoose的CRUD方法总结

-Create

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

-Read

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

-Update

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

-Delete

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

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

mongoose模块化编码

db/index.js

/*
* 该模块用于连接数据库,暴露出去一个Promise实例
* 如果连接成功了,Promise实例内部状态切换为成功
* 如果连接失败了,Promise实例内部状态切换为失败
* */
//引入mongoose
let mongoose = require('mongoose')
mongoose.set('useCreateIndex',true)
//定义数据库名
const DB_NAME = 'demo'
//定义数据库地址
const DB_URL = 'localhost:27017'
//构建一个Promise实例,用于管理数据库连接
module.exports = new Promise((resolve,reject)=>{
  //2.连接数据库
  mongoose.connect(`mongodb://${DB_URL}/${DB_NAME}`,{useNewUrlParser:true })

  //3.监听连接状态
  mongoose.connection.on('open',(err)=>{
    if(!err){
      console.log(`位于${DB_URL}上的${DB_NAME}数据库连接成功`)
      resolve()
    }else{
      reject(err)
    }
  })
})

model/studentModel.js

/*
* 该模块主要负责创建学生模型
* */
let mongoose = require('mongoose')
//操作数据库
//1.请来一个保安 ------- 引入约束Schema
let Schema = mongoose.Schema

//2.制定一个进入你家的规则 -------- 创建一个约束对象实例
let studentSchema = 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:{
    type:Schema.Types.Mixed //接收所有类型
  },
  date:{
    type:Date,
    default:Date.now()
  },
  enable_flag:{
    type:String,
    default:'Y'
  }
})

/*3.告诉保安你的规则 ------- 创建模型对象
第一个参数与数据库中的集合相对应,第二个参数指定约束对象实例
只要生成了模型对象,就可以进行数据的:增删改查*/
module.exports = mongoose.model('students',studentSchema)

model/teacherModel.js

/*
* 该模块主要负责创建教师模型
* */
let mongoose = require('mongoose')
//操作数据库
//1.请来一个保安 ------- 引入约束Schema
let Schema = mongoose.Schema

//2.制定一个进入你家的规则 -------- 创建一个约束对象实例
let teacherSchema = 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:{
    type:Schema.Types.Mixed //接收所有类型
  },
  date:{
    type:Date,
    default:Date.now()
  },
  enable_flag:{
    type:String,
    default:'Y'
  }
})

/*3.告诉保安你的规则 ------- 创建模型对象
第一个参数与数据库中的集合相对应,第二个参数指定约束对象实例
只要生成了模型对象,就可以进行数据的:增删改查*/
module.exports = mongoose.model('teachers',teacherSchema)

test.js

//引入数据库连接模块
let db = require('./db')
//引入学生模型
let studentModel = require('./model/studentModel')
//引入教师模型
let teacherModel = require('./model/teacherModel')

;(async()=>{
  //等待数据库连接成功
  await db

  //操作数据库
  let result = await studentModel.findOne({name:'班长'})
  console.log(result);

  let result2 = await teacherModel.create({
    teac_id:'20190722005',
    name:'zhangsan',
    age:90,
    sex:'男',
    hobby:['打代码','吃饭','睡觉'],
    info:'一个非常帅气的男人',
  })
  console.log(result2);
})()

node原生服务器

//1.引入http模块 ----- http是Node中的核心模块,无需下载,引入即可使用。
let http = require('http')
let {parse} = require('querystring')

//2.创建server对象
let server = http.createServer(function (request,response) {
  /*
  * request:请求对象 -------- 客户端发给服务器
  * response:响应对象 ------- 服务器给客户端
  * */
  //console.log(request.url);
  let str = request.url.split('?')[1]
  let obj = parse(str)
  console.log(obj)
  response.setHeader('content-type','text/html;charset=utf-8')
  if(obj.name === 'zhangsan'){
    response.end('<h2>zhangsan,你好好听课</h2>')
  }else if(obj.name === 'lisi'){
    response.end('<h2>lisi,你回家吧</h2>')
  }else{
    response.end('<h2>阿偶,走了丢了</h2>')
  }
})

//3.绑定端口监听
server.listen(3000,function (err) {
  if(!err){
    console.log('服务器启动成功了')
  }else{
    console.log(err)
  }
})
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353