MongoDB基础知识点
1.MongoDB简介
1.1基本信息
- 基于分布式文件存储数据
- C++语言编写
- 支持的数据结构非常松散,是类似json的bson格式(后期插入修改数据写JSON)
1.2作用
- 存放项目数据
- 实战工作开发写API接口
1.3下载
2.MongoDB安装
1.Ubuntu22.04
2.Windows(非msi)
shell
# 解压ZIP安装包
# 创建服务(cmd管理员模式下进行 D:\mongodb\bin(根据自己实际情况来))
bin>mongod --install -dbpath D:\mongodb\data --logpath D:\mongodb\logs\mongodb.log
#######或############
bin>mongod --dbpath D:\mongodb\data --logpath D:\mongodb\logs\mongodb.log --logappend --serviceName MongoDB --auth --install
# 启动服务
bin>net start mongodb
# 验证安装是否成功
bin>mongo
# 删除服务
bin>mongod.exe --remove
###########或####################
bin>sc delete mongodb
#关闭服务
net stop mongodb
3.MongoDB基本操作
1.基本概念
- 查看数据库
sql
show databases
# 或
show dbs
- 创建数据库,不建议使用单独命令创建数据库,使用use隐式创建
- 查看当前数据库
sql
db
- 选择数据库
sql
use 数据库名称
- 删除数据库,通过use选择需要删除的数据库,执行以下命令
sql
db.dropDatabase()
- 查看集合
sql
show collections
- 创建集合
- capped: 布尔值,指定是否创建固定。这种集合有大小限制,一旦达到上限,新的文档会覆盖旧的文档,默认为'false'
- size:指定固定集合的大小上限(字节数),只有在创建固定集合时才需要设置
- max: 指定固定集合的文档数上限,只有在创建固定集合时才需要设置
- autoIndexId: 布尔值,指定是否自动为'_id'字段创建索引,默认为true <该字段与Mongodb3.6弃用>
- 其他字段建议参考官方文档
sql
db.createCollection("集合名词",{
capped: true,
size: 5242880,
max: 5000
})
- 删除集合
sql
db.集合名称.drop()
- 统计集合
sql
db.集合名称.count()
2.MongoDB文件增删改查(CURD)
1.插入数据
- 集合存在,则直接插入数据,集合不存在,则隐式创建 <过时>
sql
db.集合名称.insert(json数据)
-
insertOne
- 插入单个文档到集合
sqldb.集合名词.insertOne({<文档数据>})
-
insertMany
- 插入多个文档到集合中
javascriptdb.集合名词.insertMany([{文档数据1},{文档数据2},{文档数据3},...])
-
查看集合数据
- mongodb会给插入的每条数据插入一个_id,_id的组成为时间戳 (4)+机器码 (3)+PID (2)+计数器(3)
- 可以自定义_id,只需要在插入的数据中添加_id即覆盖(不推荐使用)
sql
db.集合名称.find()
- 插入多条数据 (且数据量不大时)<过时>
sql
db.集合名称.insert({},{},{})
- 插入多条数据 (且数据量较大时)
- 可以使用js语法,mongodb底层采用的是JS引擎,支持部分JS语法
sql
for(var i = 0;i <= 10; i++){
db.infoT.insert({uname: 'a'+i,age: i+1})
}
2.查询数据
- 查看集合数据
sql
db.集合名称.find(条件 [,查询的列])
- 复合查询
sql
db.集合名称.find({键:{运算符: 值}}
运算符 | 作用 |
---|---|
$gt | 大于 |
$gte | 大于等于 |
$lt | 小于 |
$lte | 小于等于 |
$ne | 不等于 |
$in | in |
$nin | not in |
3.修改数据
- 修改数据
- 是否新增:指条件匹配不到的数据插入(true是插入,false不插入,默认)
- 是否修改多条: 指将匹配成功的数据都修改(true是,默认是false)
- updateOne: 用于更新满足条件的第一个文档
- updateMany: 用于更新满足条件的所有文档
sql
db.集合名称.update(条件,{修改器:{键: 值}})
修改器 | 作用 |
---|---|
$inc | 递增 |
$rename | 重命名列 |
$set | 修改列值 |
$unset | 删除列 |
4.删除数据
-
deleteOne
- 用于删除满足条件的第一个文档
sqldb.文档名称.deleteOne({条件})
-
deleteMany
- 用于删除满足条件的所有文档
sqldb.文档名称.deleteMany({条件})
-
删除所有文档
sqldb.文档名称.deleteMany({})
5.删除字段
- 聚合管道方式
- fieldToDelete代表需要删除的字段
javascript
db.collection.aggregate([
{ $project: {fieldToDelete: 0}},
{$unset: ["fieldToDelete"]}
])
- 删除单个文档方式
- _id用来定位要更新的文档
- fieldToDelete代表需要删除的字段
javascript
db.collection.updateOne({_id: docId},{$unset: {fieldToDelete: 1}})
4.MongoDB实战管理系统数据库设计
1.设计数据库
-
确定功能模块所属集合
-
确定集合字段
- UI设计稿每个展示内容对应一个字段
- 创建字段
- 更新字段
- 状态字段
-
练习
- 需求:根据学生管理系统,设置存放学生信息的集合,并插入20条数据
- 代码:
- 先中文
- 集合名词: 学生集合
- 集合字段: 编号、学号、姓名、电话、性别、年龄、学历、备注
- 再英文
- 先中文
javascript
use studentInfoList;
for(var num = 0;num <= 30;num++){
db.student.insertOne({
_id: num,
no: "KD"+num,
uname: '华中科技'+num,
tel: "0218522"+num,
sex: '女',
age: num,
edt: '研究生',
remark: "勤奋好学"
})
};
db;
show collections;
db.student.find();
2.Mongodb分页&排序
2.1排序
- 升序排列集合中的数据
javascript
db.collection.find().sort({key: 1})
- 降序排列集合中的数据
javascript
db.collection.find().sort({key: -1})
- 指定排序字段并排除其他字段
javascript
db.collection.find({},{key: 1}).sort({key: 1})
- 多字段进行排序
javascript
db.collection.find().sort({key1: 1,key2: -1})
2.2分页
- 查询第一页的数据,且每页包含2条数据
javascript
db.collection.find().sort({key: 1}).limit(2)
- 查询第二页的数据,每页包含2条数据,skip()函数指定从结果集中跳过的记录数
javascript
db.collection.find().sort({key: 1}).skip(2).limit(2)
3.MongoDB聚合查询
javascript
db.collection.aggregate([
{管道: {表达式}}
])
- 常用管道
管道器 | 说明 |
---|---|
$group | 将集合中的文档分组,用于统计结果 |
$match | 过滤数据,只要输出符合条件的文档 |
$sort | 聚合数据进一步排序 |
$skip | 跳过指定文档数 |
$limit | 限制集合数据返回文档数 |
- 常用表达式
表达式 | 说明 |
---|---|
$sum | 总和 $sum: 1同count表示统计 |
$avg | 平均 |
$min | 最小值 |
$max | 最大值 |
4.MongoDB优化索引
1.概括
- 说明
- 索引是一种排序的便于快速查询的数据结构
- 作用
- 实现数据的高效查询
- 优缺点
- 优点
- 提高数据查询的效率,降低数据库的IO成本
- 通过索引对数据进行排序,降低数据排序成本,降低CPU的消耗
- 缺点
- 占用磁盘空间
- 大量索引影响SQL语句的效率,每次插入或修改数据都需要更新索引
- 优点
2.创建索引
- 创建单个索引语法
- 1代表升序 -1代表降序
javascript
db.collection.createIndex({key: 1})
- 创建多个字段复合索引
javascript
db.collection.createIndex({key1: 1,key2: -1})
- 添加唯一索引
javascript
db.collection.createIndex({key: 1},{unique: 字段名})
- 添加索引并指定索引名词
javascript
db.collection.createIndex({key: 1},{name: "指定名称"})
3.删除索引
- 删除全部索引
javascript
db.collection.dropIndexes()
- 删除指定索引
javascript
db.collection.dropIndex(索引名)
4.查看索引
- 查看索引
javascript
db.collection.getIndexes()
5.分析索引
- 分析索引
- COLLESAN 全表扫描
- IXSCAN 索引扫描
- FETCH 根据索引去检索指定文档
javascript
db.collection.find().explain('executionStats')
- 未添加索引进行分析索引
javascript
db.collection.find({age: 88888}).explain('executionStats')
- 添加索引进行分析索引
javascript
db.stuInfo.createIndex({age: 1});
db.stuInfo.getIndexes();
db.stuInfo.find({age: 88888}).explain('executionStats')
5.MongoDB权限机制
1.设置权限
javascript
use 数据库名称
db.createUser({
"user: "账号",
"pwd": "密码",
"roles": [{
role: "角色",
db: "所属数据库"
}]
})
角色种类 | 说明 |
---|---|
root | 超级用户角色 |
read、readwrite | 数据库用户角色 |
dbAdmin、userAdmin | 数据库管理角色 |
clusterAdmin、clusterManager、clusterMonitor、hostManager | 集群管理角色 |
backup、restore | 备份恢复角色 |
2.开启验证模式
- 指用户需要输入账号密码才能登录使用
javascript
use admin
db.createUser({
"user": "admin",
"pwd": "1234567",
"roles": [{
role: "root",
db: "admin"
}]
})
- 安装需要身份验证的MongoDB服务(windows)
javascript
/bin>mongod.exe --install --dbpath D:\MongoDB\data --logpath D:\MongoDB\log\mongodb2.log --auth
/bin>net start mongodb
3.登录(windows)
javascript
/bin> mongo 服务器IP地址:端口/数据 -u 用户名 -p 密码
或
mongo
use 数据库名
db.auth(用户名,密码)
6.MongoDB备份还原
1.备份数据库
- 参数解析
- port 数据库端口
- d 数据库(数据库不写则导出全局)
- o 备份数据放入指定目录
shell
/bin>mongodump -h -port -u -p -d -o
2.还原数据库
- 参数解析
- d不写则还原全部数据
shell
/bin>mongorestore -h -port -u -p -d --drop 备份数据目录