数据库

143 阅读7分钟

一 数据库

1数据库是什么?

数据库是按照数据结构来组织、存储和管理数据的仓库

2为什么要用?

我们的程序都是在内存中运行的,一旦程序运行结束或计算机断电,程序运行中的数据都会丢失。所以我们就需要将一些程序运行的数据持久化到硬盘中,以确保数据的安全性,而数据库就是数据持久化的最佳选择,数据库就是存储数据的仓库。

3数据库的分类

1关系型数据库(RDBS)

代表有:MySQL(主打轻量加免费,新版本收费,但仍提供旧版本)、Oracle(稳定,收费高,庞大)、DB2(介于前面二者之间)、SQL Server(操作简单,目前很少用)...

特点:关系紧密,都是表

优点:

1.易于维护:都是表结构,格式一致

2.使用方便:SQL通用,可用于复杂查询

3.高级查询:可用于一个表以及多个表之间非常复杂的查询

缺点:

1、读写性能比较差,尤其是海量数据的高效率的读写

2、有固定的表结构,灵活度欠缺

3、高并发读写需求,传统关系型数据库来说,硬盘I/O是个很大的瓶颈

2非关系型数据库(NoSQL)

代表有:MongoDB、Redis...

特点:关系不紧密,有文档,有键值对

优点:

1格式灵活:存储数据的格式可以是key,value形式

2 速度快:nosql可以内存作为载体,而关系型数据库只能使用硬盘

3易用:nosql数据库部署简单

缺点:

1 不支持sql,学习和使用成本较高

2 不支持事务

3 复杂查询时语句过于繁琐

事务:原子性、不可分割性,例如转账,你扣一些钱,对方要加一些钱

二 MongoDB

1MongoDB简介

MongoDB是为快速开发互联网web应用而设计的数据库系统、

MongoDB的设计目标是极简、灵活、作为web应用栈的一部分

MongoDB的数据模型是面向文档的,所谓文档是一种类似于Json的结构,简单理解MongoDB这个数据库中存的是各种各样的JSON(BSON)

2安装MongoDB

1安装步骤

2启动MongoDB服务

  1. 添加环境变量,将MongoDB的bin目录添加到path
  2. c盘根目录创建如下文件夹
    

C:\data\db

  1. 打开命令行窗口输入mongod启动数据库服务器
    
  2. 打开一个新的命令行窗口输入mongo启动数据库的客户端
    

端口号:任何一个应用,都要运行在某一个端口上

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

常见端口号:

21端口:FTP 文件传输服务

22端口:SSH端口

23:TELNET终端仿真服务

3306:Mysql默认端口号

27017端口:MongoDB实例默认端口

3MongoDB服务器

1)服务器负责在计算机创建数据库,使用数据库需要先启动服务器

2)MongoDB的默认端口号27017

​ a 可以通过一个--port来指定端口号

​ b 端口号尽量使用四位以上,不要超过最大端口号65535

​ c 不能使用其他服务占用的端口号

3)MongoDB数据库默认会放在C盘根目录下的data/db

​ a可以通过--dbpath指令来指定数据库的目录

​ 结合使用:

​ mongod --dbpath C:\users\web --port 12345

启动服务的命令窗口不能关闭

4MongoDB客户端

1)我们通过客户端来管理数据库

2)使用mongo来启动客户端

3将MOngoDB数据库设置为windows系统服务

1)在C盘根目录创建如下文件夹

c:\data\log

C:\data\db

2)在MongoDB的安装目录添加一个配置文件

目录:c:\Program Files\MongoDB\Server\3.2

文件:mongod.cfg

3)以管理员身份打开命令窗口

4)执行以下命令

sc.exe create MongoDB binPath= "\"C:\Program Files\MongoDB\Server\3.2\bin\mongod.exe\" --service --config=\"C:\Program Files\MongoDB\Server\3.2\mongod.cfg\"" DisplayName= "MongoDB" start= "auto"

  1. 打开系统服务器,启动名为MongoDB的服务  
    
  2. 如果无法启动服务,在管理员的命令行窗口中输入如下指令
    

sc delete MongoDB

  1. 重复步骤1
    

对于关系型数据库:

EXcel文件----数据库

sheet页签----表

列 头----字段------某些字段是一条数据的唯一标识,那么就称为主键

一 行-----一条数据

对于非关系型数据库:

EXcel文件----数据库

sheet页签----集合

列 头----字段

一 行-----一条文档

三MongoDB的使用

1简介

1.1数据库(database)

数据库是一个仓库,在仓库中可以存放集合。

1.2集合(collection)

集合类似于JS中的数组,在集合中可以存放文档。

说白了,集合就是一组文档。

1.3文档(document)

文档数据库中的最小单位,我们存储和操作的内容都是文档。

类似于JS中的对象,在MongoDB中每一条数据都是一个文档。

image-20210613140112439

2使用

2.1 基本命令

  1. 显示所有的数据库
    

show dbs

​ show databases

  1. 切换到指定的数据库
    

use 数据库名

  1. 显示当前所在的数据库
    

db

  1. 删除当前数据库
    

db.dropDatabase()

  1. 显示当前数据库中的所有集合
    

show collections

  1. 删除当前集合
    

db.collection.drop()

7)向当前数据库的students集合中插入一个文档

db.students.insert()

2.2 操作命令

在MongoDB,数据库和集合都不需要创建,当我们向集合或数据库中第一次插入文档时,集合和数据库会自动创建。

  1. 向集合中插入文档
    

db..insert(doc)

如:db.stus.insert({name:"sunwukong",age:18})

  1. 查询集合中的文档
    

db..find()

如:db.stus.find()

2.3数据库的CRUD

查询网址: docs.mongodb.com/manual/refe…

  1. 向集合中插入文档(create

db.collection.insert({}) 向集合中插入一个文档

db.collection.insertOne({}) 向集合中插入一个文档

db.collection.insertMany({},{}) 向集合中插入多个文档

  1. 查询集合中的文档(read)
    

db.collection.find(查询条件,[投影]) 查询集合中所有符合条件的文档,总是会返回一个数组个文档对象

投影:过滤掉不想要的数据,只保留想要展示的数据

例如:

db.collection.find({name:'高三'},{stu_id:1,grade:1}) 1是要这个属性,0是不要这个属性,但是0和1不能混用

常用操作符:

​ \1. 操作符: >, >=, <, <=, != 对应: “gt","gt", "gte", "lt","lt", "lte", "$ne"

例如:db.collection.find({age:{$lt:19}})

​ \2. 操作符:"or","or", "in","$nin"

例如:db.collection.find({age:{$in:[18,19]}})

​ db.collection.find({$or:[{age:18},{age:19}]})

​ db.collection.find({age:{$nin:[19,17]}})

​ \3. 正则表达式

例如:db.collection.find({name:/^T/})

​ \4. "$where"

例如:

db.collection.find({$where:function(){

​ return this.name=='zhangsan'&&this.age==18;

}})

db.collection.findOne(查询条件)只查到第一次出现的数据

  1. 修改集合中的文档(update

db.collection.update(查询条件,新的文档,【配置对象】) 修改或替换一个或多个文档

//如下写法会将更新内容替换掉整个文档对象,但_id不受影响

db.collection.update({name:'zhangsan'},{age:19})

//使用$set修改指定内容,其他数据不变,不过只能匹配一个张三

db.collection.update({name:'zhangsan'},{$set:{age:19}})

//修改多个文档对象,匹配多个zhangsan,把所有zhangsan的年龄都替换成19

db.collection.update({name:'zhangsan'},{$set:{age:19}},{multi:true})

再补充:

db.集合.updateOne()

db.集合.updateMany()

  1. 删除集合中的文档(delete

db.collection.remove(查询条件) 删除所有(或第一个)符合条件的文档

四Mongoose的使用

1简介

Mongoose是一个对象文档模型(ODM)库,它对Node原生的MongoDB模块进行了进一步的优化封装,并提供了更多的功能。

是一个在node平台下,一个知名的用于帮助开发者连接MongoDB的包

为什么要用Mongoose?

想在node平台下,更加简单、方便、安全、稳定的的操作MongoDB

2优势

  1. 可以为文档创建一个模式结构(Schema)
    
  2. 可以对模型中的对象/文档进行验证
    
  3. 数据可以通过类型转换转换为对象模型
    
  4. 可以使用中间件来应用业务逻辑挂钩
    
  5. 比Node原生的MongoDB驱动更容易
    

3核心对象

3.1 Schema

模式对象,通过Schema可以对集合进行约束

3.2 Model

模型对象,相当于数据库中的集合,通过该对象可以对集合进行操作

3.3 Document

文档对象,它和数据库中的文档相对应,通过它可以读取文档的信息,也可以对文档进行各种操作

4连接数据库

let mongoose=require('mongoose')
//1连接数据库
mongoose.connect('mongodb://localhost:27017/test',{
    useNewUrlParser:true,//使用新的url解释器,用于解决安全问题
    useUnifiedTopology: true//统一的新的拓扑结构
})
//2绑定数据库连接监听
mongoose.connection.on('open',function(eor){
    if(eor){
        console.log('数据库连接失败')
    }else{
        console.log('数据库连接成功')
        //3操作数据库
        console.log('操作数据库')
    }
})
let mongoose=require('mongoose')
mongoose.set('useCreateIndex',true);//使用一个新的索引创建器
//1连接数据库
mongoose.connect('mongodb://localhost:27017/test',{
    useNewUrlParser:true,//使用新的url解释器,用于解决安全问题
    useUnifiedTopology: true//统一的新的拓扑结构

})
//2绑定数据库连接监听
mongoose.connection.on('open',function(eor){
    if(eor){
        console.log('数据库连接失败')
    }else{
        console.log('数据库连接成功')
        //3操作数据库
        //1 请来一个帮你看门的保安----引入模式对象
        let Schema = mongoose.Schema
        //2 制定你家的规则------------创建约束对象
        let teachersRule=new Schema({
            stu_id:{
                type:String,//限制为字符串
                require:true,//限制为必填
                unique:true//限制其唯一
            },
            name:{
                type:String,//限制为字符串
                require:true,//限制为必填
            },
            age:{
                type:Number,//限制为字符串
                require:true,//限制为必填
            },
            hoppy:[String],//限制其职能为数组,且数组中的每一项是字符串
            info:Schema.Types.Mixed,//接收所有类型
            date:{
                type:Date,
                default:Date.now(),
                require:true,//限制为必填
            },
            enable_flag:{
                type:String,
                default:'Y'
            }
        })
        // 3 告诉保安你的规则---------创建模型对象
        let teacherModel=mongoose.model('teacher',teachersRule)//用于生成某个集合所对应的模型对象
       //新增操作
        teacherModel.create({
            stu_id:'003',
            name:'zhs',
            age:23,
            hoppy:['吃饭','唱歌'],
            info:66644
        },function(err,data){
            if(!err) console.log(data)
            else console.log(err)
        })
        //查询操作
        //find方法,1 返回的是个数组,就算是一条数据,也包裹在一个数组中 2 若为空,则返回空数组
        teacherModel.find({name:'q'},function(err,data){
            if(!err) console.log(data)
            else console.log(err)
        })

        //findOne方法:1若有结果,返回的是一个对象,若没有,返回null
        teacherModel.findOne({name:'q'},{age:1,_id:0},function(err,data){
            if(!err) console.log(data)
            else console.log(err)
        })

        //更新操作update弃用 可用updateOne updateMany
        teacherModel.updateOne({name:'qwx'},{age:6},function(err,data){
            if(!err) console.log(data)
            else console.log(err)
        })

        //删除操作
        teacherModel.deleteMany({age:16},{age:6},function(err,data){
            if(!err) console.log(data)
            else console.log(err)
        })
    }
})

5Mongoose模块化

1)	tools/db.js
// 该模块专门用来连接MongoDB数据库
var mongoose = require("mongoose");
const DB_NAME='mongoose_test'
const PORT='27017'
const IP='localhost'
function aaa(callback){
    mongoose.connect("mongodb://${IP}:${PORT}/${DB_NAME}");
    mongoose.connection.on("open",function (eor) {
      if(eor){
        console.log('数据库连接失败')
        callback('连接失败');
   	 }else{
        console.log('数据库连接成功')
        callback();
   	 }
    });
}
model.exports=aaa;

2)	models/student.js
//来定义Student的模型
var mongoose = require("mongoose");
var Schema = mongoose.Schema;

//创建约束对象
var stuSchema = new Schema({
  name:String,
  age:Number,
  gender:{
    type:String,
    default:"女"
  },
  address:String
});

//创建模型
var Student = mongoose.model("student",stuSchema);

//将Student暴露出去
module.exports = Student;

3)	test.js
//引入db.js
var db = require("./tools/db");

//引入student.js
var Student = require("./models/student");
db(function(err){
	if(err) console.log(err);
	else{
		 Student.create({
          name:"二郎神",
          age:"48",
          gender:"男",
          address:"小圣庙"
          },function (err) {
          if(!err){
          console.log("插入成功");
          }
          });
	}
})