【前端】-【MongoDB基础】-学习笔记
1 数据库分类
1.1 关系型数据库
例如:MySQL(轻量、免费)、Oracle(非常大、付费)、SQL Server(操作简单,教学比较多)
特点:关系紧密,都是表
优点:
- 易与维护:都是使用表结构,格式一致
- 使用方便:SQL语句通用,可用于复杂查询
- 高级查询:可用于一个表以及多个表之间复杂的查询
缺点:
- 读写性能比较差,尤其是海量数据的高效率读写
- 有固定的表结构,字段不可随意更改,灵活性欠佳
- 高并发读写需求,传统关系型数据库来说,硬盘I/O是一个很大的瓶颈
1.2 非关系型数据库NoSQL
例如:MongoDB、Redis
特点:关系不紧密,有文档,有键值对
优点:
- 格式灵活:存储格式是key,value形式
- 速度快:nosql可以内存作为载体,而关系型数据库只能使用硬盘
- 易用:nosql数据库部署简单
缺点:
- 不支持sql,学习和使用成本较高
- 不支持事务(跟钱有关系的都不用)
- 复杂查询时语句过于繁琐 对
2 MongoDB
2.1 简介
MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
2.2 安装
- 下载地址:https://www.mongodb.com/try/download/community
- 安装
- 添加到系统环境变量(如果不添加,没有
mongod
命令) - 在C盘创建data文件夹里面再创建一个db文件夹
C:\data\db
- 启动mongodb服务器命令:
mongod
,mongodb默认的端口:27017
,等待连接
打开一个新的命令行窗口,输入mongo
命令,就连接成功了
默认保存在 C:\data\db
,设置mongodb数据库的存储路径:mongod --dbpath 路径
2.3 配置服务
配置 MongoDB 为服务,以后不需要在命令行里面启动,自动启动
可以使用MongoDB Compass图形化使用MongoDB
下载地址 https://www.mongodb.com/try/download/compass
常见端口号:
http 80 https443 MySQL3306
3 MongoDB使用
- 数据库 database
- 集合(数组) collection
类似与SQL中的数据表,本质上是一个数组,里面包含看多个文档对象,[{},{},{}]
- 文档对象 document
类似与SQL中的记录,一个文档对象{}
就是一条记录
菜鸟教程https://www.runoob.com/mongodb/mongodb-tutorial.html
3.1 简单操作命令
db
查看当前操作的数据库
show dbs
:查看所有的数据库
use test
:切换到指定的test数据库
show collections
:查看当前数据库中所有的集合
db.collectionName.insert()
:在当前数据库的collectionName集合中插入一个文档
例如:db.student.insert( {name:'liu',age:18,sex:'男'}
3.2 MongoDB_GUI工具 (studio 3T)
下载地址:https://studio3t.com/download/
这个工具可以连接多个数据库
当前电脑:localhost、127.0.0.1
4 MongoDB原生CRUD(增删改查)
4.1 C-creat 新增数据
db.collectionName.insert( {name:'liu'} )
插入一条数据
db.collectionName.insertOne( {name:'liu'} )
插入一条数据
db.collectionName.insertMany( [ {name:'ykyk'} , {name:'ykyk123'} ] )
插入多条数据
4.2 R-read查询数据
查询数据find
db.collectionName.find()
查询集合所有的文档,即所有的数据。查询到的是整个数组对象。在最外层是有一个对象包裹起来的。
db.collectionName.find({name:"hhh"})
条件查询。结果返回的是一个【数组】,可以在后面直接取索引下标
db.collectionName.find({name:"hhh"},{stu_id:1,grade:1,_id:0})
条件查询,只返回年级和学生id
_id可以0和1混用,其他的只能是0或者1
db.collectionName.findOne()
查找第一个。效率更高。(比如身份证号,手机号)
查询操作符:
- 比较
$gt
大于>
$gte
大于等于>=
$lt
小于<
$lte
小于等于<=
$ne
不等于!=
$eq
等于的另一种写法= - 逻辑或
$or
,$in
$or
或者db.students.find({$or:[{age:18},{age:19}]});
$in
或者db.students.find({age:{$in[18,20]}});
【记住】 - 逻辑非:
$nin
db.students.find({age:{$nin[18,20]}});
- 正则:
举例:db.students.find({name:/^T/})
- $where能写函数:
db.students.find({$where:function(){
return this.name==='zhangsan' && this.age===18
}})
4.3 U-update更新数据
db.collectionName.update(查询条件,要更新的内容[,配置对象])
db.users.update({name:'zhangsan'},{age:19})
会替换掉整个文档对象,但_id不受影响
db.users.update({name:'zhangsan'},{$set:{age:19}})
使用$set
修改指定内容,其他数据不变,不过只能匹配一个zhangsan
db.users.update({name:'zhangsan'},{$set:{age:19}},{multi:true})
修改多个文档对象,匹配多个zhangsan,年龄都替换成19【记住】
补充:update默认与updateOne()
等效,即对于匹配到的文档只更改其中的第一个
updateMany()
可以用来更改匹配到的所有文档
db.students.updateMany({name:'ykky'},{age:21,gender:222}})
4.4 D-delete删除数据
【一般不会删除】
db.collectionName.remove(查询条件)
db.students.remove({name:'zhangsan})
删除名字是zhangsan的
5 连接数据库Mongoose
非关系型数据库:对象文档模型:ODM(object doument model)
5.1 Mongoose简介
Mongoose
是一个对象文档模型(ODM)库,它对Node原生的MongoDB
模块进行了进一步的优化封装,并提供更多的功能。
5.2 Mongoose优势
- 可以为文档创建一个模式结构(Schema)
- 可以对模型中的对象/文档进行验证
- 数据可以通过类型转换为对象模型
- 可以使用中间件来应用业务逻辑挂钩
- 比Node原生MongoDB驱动更容易
为什么用Mongoose?
想在Node平台下,简单、高效、安全、稳定的操作
安装:npm i mongoose
在引入第三方库时,如果本文件夹内没有找到node_modules,找外层文件夹,直到根目录
连接数据库
# 引入mongoose
let mongoose=require('mongoose')
# 连接mongodb数据库
mongoose.connect('mongodb://localhost:27017/demo',{
useNewUrlParser: true,
useUnifiedTopology: true,
});
# 监听mongodb数据库的连接状态
mongoose.connection.on("open", function(err) => {
if(err){
console.log("数据库连接失败!",err);
}else{
console.log("数据库连接成功");
console.log("操作数据库");
}
});
5.3 连接数据库并创建Schema对象和Model对象
let mongoose=require('mongoose')
mongose.set('useCreateIndex',ture)//使用一个新的索引创建器
mongoose.connect('mongodb://localhost:27017/demo',{
useNewUrlParser: true,
useUnifiedTopology: true,
});
mongoose.connection.on("open", function(err) => {
if(err){
console.log("数据库连接失败!",err);
}else{
console.log("数据库连接成功");
#1 保安---- 引入模式对象
let Schema = mongoose.Schema;
#2 指定规则 -----创建约束对象
let stuSchema== new Schema({
stu_id:{
type:String,
required:true, //限制学号是必填
unique:true //限制学号唯一
},
name:{
type:String,
required:true,
},
age:{
type:Number,
required:true,
},
habby:[String],//限制爱好必须为数组,数组中每一项都是字符串
info:Schema.Types.Mixed,//接收所有类型
date:{
type:Date,
default:Date.now()
},
enable_flag:{
type:String,
default:'Y'
}
})
#3 告诉保安你的规则----创建模型对象
let stuModel=mongoose.model('students',stuSchema)//用于生成某个集合所对应的模型对象
}
});
5.4 Mongoose的CRUD(增删改查)
- 添加操作
# 4 真正有人要进入你家了 ----- 添加
stuModel.create({
stu_id:'001',
name:'张三',
age:18,
habby:['吃饭','睡觉','敲代码'],
info:66666,
},function(err,data){
if(!err) console.log(data);
else console.log(err);
})
})
- 查询操作
find()
方法:
- 返回一个数组,就算一个文档也包裹一个数组
- 若为空,返回空数组
findOne()
方法:
- 若有结果,返回一个对象
- 若为没有结果,返回null
# 4 真正有人要进入你家了 ----- 查询
stuModel.find({
stu_id:'001',
},function(err,data){
if(!err) console.log(data);
else console.log(err);
})
})
- 查询 只要年龄
stuModel.find({name:'班长'},{age:1,_id:0},function(err,data){
if(!err) console.log(data);
else console.log(err);
})
})
- 更新操作
update()
:即将被弃用,建议用后两个
updateOne()
updateMany()
# 4 真正有人要进入你家了 ----- 更新
stuModel.update({stu_id:'001'},{age:6},function(err,data){
if(!err) console.log(data);
else console.log(err);
})
})
- 删除操作
delete()
deleteMany()
# 4 真正有人要进入你家了 ----- 删除
stuModel.delete({age:6},function(err,data){
if(!err) console.log(data);
else console.log(err);
})
})
5.5 模块化处理
- 数据库连接,文件
db/db.js
let mongoose=require('mongoose')
mongose.set('useCreateIndex',ture)//使用一个新的索引创建器
const DB_NAME='demo'
const POST=27017
const IP='localhost'
function connetMongo(callback){
mongoose.connect('mongodb://localhost:27017/demo',{
useNewUrlParser: true,
useUnifiedTopology: true,
});
mongoose.connection.once("open", function(err) => {
if(err){
console.log("数据库连接失败!",err);
callback('connet failed')
}else{
console.log("数据库连接成功");
callback();
}
})
}
module.exports = connetMongo
- 创建模型对象
model/stuModel.js
let mongoose=require('mongoose')
#1 保安---- 引入模式对象
let Schema = mongoose.Schema;
#2 指定规则 -----创建约束对象
let stuSchema== new Schema({
stu_id:{
type:String,
required:true, //限制学号是必填
unique:true //限制学号唯一
},
name:{
type:String,
required:true,
},
age:{
type:Number,
required:true,
},
habby:[String],//限制爱好必须为数组,数组中每一项都是字符串
info:Schema.Types.Mixed,//接收所有类型
date:{
type:Date,
default:Date.now()
},
enable_flag:{
type:String,
default:'Y'
}
})
#3 告诉保安你的规则----创建模型对象
model.exports = mongoose.model('students',stuSchema)//用于生成某个集合所对应的模型对象
- 在最终的文件
app.js
let mongoose = require('mongoose')
let db = require('./db/db') //引入连接数据库
let stuModel = require('./model/stuModel') //引入
db(function(err){
if(err) console.log(err)
else{
stuModel.create({
stu_id:'001',
name:'张三',
age:18,
habby:['吃饭','睡觉','敲代码'],
info:66666,
},function(err,data){
if(!err) console.log(data);
else console.log(err);
})
})
}
})