一 数据库
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服务
-
添加环境变量,将MongoDB的bin目录添加到path下 -
在c盘根目录创建如下文件夹
C:\data\db
-
打开命令行窗口输入mongod启动数据库服务器 -
打开一个新的命令行窗口输入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"
-
打开系统服务器,启动名为MongoDB的服务 -
如果无法启动服务,在管理员的命令行窗口中输入如下指令
sc delete MongoDB
-
重复步骤1
对于关系型数据库:
EXcel文件----数据库
sheet页签----表
列 头----字段------某些字段是一条数据的唯一标识,那么就称为主键
一 行-----一条数据
对于非关系型数据库:
EXcel文件----数据库
sheet页签----集合
列 头----字段
一 行-----一条文档
三MongoDB的使用
1简介
1.1数据库(database)
数据库是一个仓库,在仓库中可以存放集合。
1.2集合(collection)
集合类似于JS中的数组,在集合中可以存放文档。
说白了,集合就是一组文档。
1.3文档(document)
文档数据库中的最小单位,我们存储和操作的内容都是文档。
类似于JS中的对象,在MongoDB中每一条数据都是一个文档。
2使用
2.1 基本命令
-
显示所有的数据库
show dbs
show databases
-
切换到指定的数据库
use 数据库名
-
显示当前所在的数据库
db
-
删除当前数据库
db.dropDatabase()
-
显示当前数据库中的所有集合
show collections
-
删除当前集合
db.collection.drop()
7)向当前数据库的students集合中插入一个文档
db.students.insert()
2.2 操作命令
在MongoDB,数据库和集合都不需要创建,当我们向集合或数据库中第一次插入文档时,集合和数据库会自动创建。
-
向集合中插入文档
db..insert(doc)
如:db.stus.insert({name:"sunwukong",age:18})
-
查询集合中的文档
db..find()
如:db.stus.find()
2.3数据库的CRUD
查询网址: docs.mongodb.com/manual/refe…
-
向集合中插入文档(create)
db.collection.insert({}) 向集合中插入一个文档
db.collection.insertOne({}) 向集合中插入一个文档
db.collection.insertMany({},{}) 向集合中插入多个文档
-
查询集合中的文档(read)
db.collection.find(查询条件,[投影]) 查询集合中所有符合条件的文档,总是会返回一个数组个文档对象
投影:过滤掉不想要的数据,只保留想要展示的数据
例如:
db.collection.find({name:'高三'},{stu_id:1,grade:1}) 1是要这个属性,0是不要这个属性,但是0和1不能混用
常用操作符:
\1. 操作符: >, >=, <, <=, != 对应: “gte", "lte", "$ne"
例如:db.collection.find({age:{$lt:19}})
\2. 操作符:"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(查询条件)只查到第一次出现的数据
-
修改集合中的文档(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()
-
删除集合中的文档(delete)
db.collection.remove(查询条件) 删除所有(或第一个)符合条件的文档
四Mongoose的使用
1简介
Mongoose是一个对象文档模型(ODM)库,它对Node原生的MongoDB模块进行了进一步的优化封装,并提供了更多的功能。
是一个在node平台下,一个知名的用于帮助开发者连接MongoDB的包
为什么要用Mongoose?
想在node平台下,更加简单、方便、安全、稳定的的操作MongoDB
2优势
-
可以为文档创建一个模式结构(Schema) -
可以对模型中的对象/文档进行验证 -
数据可以通过类型转换转换为对象模型 -
可以使用中间件来应用业务逻辑挂钩 -
比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("插入成功");
}
});
}
})