MongoDB
1. 简介
1. Mongodb
是什么
MongoDB
是一个基于分布式文件存储的数据库,官方地址 https://www.mongodb.com/
2. 数据库是什么
数据库(DataBase
)是按照数据结构来组织、存储和管理数据的 应用程序
3. 数据库的作用
数据库的主要作用就是 管理数据 ,对数据进行 增(c
)、删(d
)、改(u
)、查(r
)
4. 数据库管理数据的特点
相比于纯文件管理数据,数据库管理数据有如下特点:
- 速度更快
- 扩展性更强
- 安全性更强
5. 为什么选择 Mongodb
操作语法与 JavaScript
类似,容易上手,学习成本低
2. 核心概念
Mongodb
中有三个重要概念需要掌握
- 数据库(
database
) 数据库是一个数据仓库,数据库服务下可以创建很多数据库,数据库中可以存放很多集合 - 集合(
collection
) 集合类似于JS
中的数组,在集合中可以存放很多文档 - 文档(
document
) 文档是数据库中的最小单位,类似于JS
中的对象
JSON 文件示例:
{"accounts": [{"id": "zCfPCqaJ-","title": "属性","time": "2024-01-27","type": "2","account": "22","remarks": "11"},{"id": "111","title": "asd","time": "2024-01-25","type": "1","account": "13931971596","remarks": "11"}]
}
大家可以通过 JSON
文件来理解 Mongodb
中的概念
- 一个
JSON
文件 好比是一个 数据库 ,一个Mongodb
服务下可以有N
个数据库 JSON
文件中的 一级属性的数组值 好比是 集合- 数组中的对象好比是 文档
- 对象中的属性有时也称之为 字段
一般情况下
- 一个项目使用一个数据库
- 一个集合会存储同一种类型的数据
3. 下载安装与启动
下载地址: https://www.mongodb.com/try/download/community
建议选择 zip 类型, 通用性更强(选择5.*
版本,直接可以运行本地客户端)
配置步骤如下:
- 将压缩包移动到
C:\Program Files
下,然后解压 - 创建
C:\data\db
目录,mongodb
会将数据默认保存在这个文件夹 - 以
mongodb
中bin
目录作为工作目录,启动命令行 - 运行命令
mongod
看到最后的 waiting for connections
则表明服务 已经启动成功
然后可以使用 mongo
命令连接本机的 mongodb
服务
注意:
- 为了方便后续方便使用
mongod
命令,可以将bin
目录配置到环境变量Path
中- 千万不要选中服务端窗口的内容 ,选中会停止服务,可以 敲回车 取消选中
4. 命令行操作
1. 数据库命令
- 显示所有的数据库
show dbs
- 切换到指定的数据库,如果数据库不存在会自动创建数据库
use 数据库名
- 显示当前所在的数据库
db
- 删除当前数据库
use 数据库名
db.dropDatabase()
2. 集合命令
- 创建集合
db.createCollection('集合名称')
- 显示当前数据库中的所有集合
show collections
- 删除某个集合
db.集合名.drop()
- 重命名集合
db.集合名.renameCollection('newName')
3. 文档命令
- 插入文档
db.集合名.insert(文档对象);
- 查询文档
db.集合名.find() // 查询全部
db.集合名.find(查询条件)
_id 是 mongodb 自动生成的唯一编号,用来唯一标识文档
- 更新文档
db.集合名.update(查询条件,新的文档) // 新的对象会替换原数据对象
db.集合名.update({name:'张三'},{$set:{age:19}}) // 只改age属性
- 删除文档
db.集合名.remove(查询条件)
5. Mongoose
1. 介绍
Mongoose
是一个对象文档模型库,官网 http://www.mongoosejs.net/
2. 作用
方便使用代码操作 mongodb
数据库
3. 使用流程
// 1. 安装mongoose
// npm install mongoose// 2. 导入mongoose
const mongoose = require('mongoose');// 3. 连接mongodb服务
// mongoose.connect('mongodb://127.0.0.1/books') // 端口可以不写
mongoose.connect('mongodb://127.0.0.1:27017/books')// 4. 设置回调
// 设置连接成功的回调 once 一次事件 事件回调函数只执行一次
// mongoose.connection.on('open', ()=>{
mongoose.connection.once('open', ()=>{// 5. 创建文档的结构类型// 设置集合中文档的属性以及属性值的类型let BookSchema = new mongoose.Schema({title: String,author: String,price: Number})// 6. 创建模型对象,对文档操作的封装对象let BookModel = mongoose.model('books', BookSchema)// 7. 新增BookModel.create({title: '西游记',author: '吴承恩',price: 19.9}).then((data)=>{console.log(data)}).catch(err=>{console.log(err)});
})// 设置失败成功的回调
mongoose.connection.on('error', ()=>{console.log('连接失败')
})// 设置连接关闭的回调
mongoose.connection.on('close', ()=>{console.log('关闭成功')
})// 关闭 mongodb 的连接
// setTimeout(() => {
// mongoose.disconnect()
// }, 2000);
4. 字段类型
类型 | 描述 |
---|---|
String | 字符串 |
Number | 数字 |
Boolean | 布尔值 |
Array | 数组,也可以使用[] 来标识 |
Date | 日期 |
Buffer | Buffer 对象 |
Mixed | 任意类型,需要使用mongoose.Schema.Types.Mixed 指定 |
ObjectId | 对象ID ,需要使用mongoose.Schema.Types.ObjectId 指定 |
Decimal128 | 对象ID ,需要使用mongoose.Schema.Types.Decimal128 指定 |
5. 字段值验证
Mongoose
有一些内建验证器,可以对字段值进行验证
- 必填项
title: {type: String,required: true // 设置必填项
},
- 默认值
name: {type: String,default: '匿名' //默认值
},
- 枚举值
gender: {type: String,enum: ['男','女'] //设置的值必须是数组中的
},
- 唯一值
username: {type: String,unique: true
},
unique
需要 重建集合 才能有效果- 永远不要相信用户的输入
6. CURD
数据库的基本操作包括四个,增加(create
),删除(delete
),修改(update
),查(read
)
- 增加
- 插入一条数据
let BookSchema = new mongoose.Schema({title: String,author: String,price: Number
})
let BookModel = mongoose.model('books', BookSchema)
BookModel.create({title: '西游记',author: '吴承恩',price: 19.9}).then((data)=>{console.log(data)}).catch(err=>{console.log(err)});
})
- 批量插入数据
BookModel.insertMany([{.....}]).then(data => {console.log(data)
}).catch(err=>{console.log(err)
})
- 删除
- 删除一条数据
// 删除一条
BookModel.deleteOne({name: '西游记'}).then(data => {console.log(data)
}).catch(err=>{console.log(err)
})
- 批量删除数据
// 批量删除
BookModel.deleteMany({is_hot: false}).then(data => {console.log(data)
}).catch(err=>{console.log(err)
})
- 更新
- 更新一条数据
BookModel.updateOne({name: '西游记'}, {name: '美丽的大山'}).then(data => {console.log(data)
}).catch(err=>{console.log(err)
})
- 批量更新数据
BookModel.updateMany({author: '余华'},{is_hot: false}).then(data => {console.log(data)
}).catch(err=>{console.log(err)
})
- 查询
- 查询一条数据
// 查询一条
BookModel.findOne({name: '西游记'}).then(data => {console.log(data)
}).catch(err=>{console.log(err)
})// 根据id查询
BookModel.findById('65bf0614a99462c1f628824c').then(data => {console.log(data)
}).catch(err=>{console.log(err)
})
- 批量查询数据
// 查询全部
BookModel.find().then(data => {console.log(data)
}).catch(err=>{console.log(err)
})// 批量查询
BookModel.find({author: '余华'}).then(data => {console.log(data)
}).catch(err=>{console.log(err)
})
7. 条件控制
- 运算符
在mongodb
不能> < >= <= !==
等运算符,需要使用替代符号
>
使用$gt
<
使用$lt
>=
使用$gte
<=
使用$lte
!==
使用$ne
db.students.find({id:{$gt:3}}); id号比3大的所有的记录
- 逻辑运算
$or
逻辑或的情况
db.students.find({$or:[{age:18},{age:24}]});
$and
逻辑与的情况
db.students.find({$and: [{age: {$lt:20}}, {age: {$gt: 15}}]});
- 正则匹配
条件中可以直接使用JS
的正则语法,通过正则可以进行模糊查询
db.students.find({name:/imissyou/});
db.students.find({name:new RegExp('imissyou')});
8. 个性化读取
- 字段筛选
BookModel.find().select({name: 1, author: 1, _id: 0}
.then(data =>{console.log(data)
}).catch(err=>{console.log(err)
})
- 数据排序
BookModel.find().select({name: 1, price: 1, _id: 0}).sort({price:-1})
.then(data =>{console.log(data)
}).catch(err=>{console.log(err)
})
- 数据截取
BookModel.find().select({name: 1, price: 1, _id: 0}).skip(4).limit(3)
.then(data =>{console.log(data)
}).catch(err=>{console.log(err)
})
9. 模块化
示例
6. 图形化管理工具
我们可以使用图形化的管理工具来对 Mongodb 进行交互,这里演示两个图形化工具
Robo 3T
免费 https://github.com/Studio3T/robomongo/releasesNavicat
收费 https://www.navicat.com.cn/
获取地址