# 简介
- Mongodb 文档数据库,存储的是文档 (Bson>json 的二进制化)
特点:内部执行引擎为 JS 解释器,把文档存储成 bson 结构,在查询时,转化为就、JS 对象,并可以通过熟悉的 JS 语法来操作
- Mongodb 和传统数据库相比最大的不同
传统型数据库:结构化数据,定好了表结构后,每一行的内容必是符合表结构的,就是说 - 列的个数,类型都一样
Mongodb 文档型数据库:表下的每篇文档都可以有自己独特的结构 (json 对象都可以有自己独特的属性和值)
- 下载地址
# Linux 安装 mongodb
- 下载
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel80-4.4.1.tgz
- 解压
tar -zxvf mongodb-linux-x86_64-rhel80-4.4.1.tgz
- 将解压包拷贝至指定目录
mv mongodb-linux-x86_64-rhel80-4.4.1 /usr/local/mongodb
- 创建数据存放目录与日志存放目录
mkdir -p /usr/local/mongodb/data /usr/local/mongodb/logs
- 启动 mongodb 服务
/usr/local/mongodb/bin/mongod –dbpath=/usr/local/mongodb/data –logpath=/usr/local/mongodb/logs/mongodb.log –logappend –port=27017 --fork
- 登录
/usr/local/mongodb/bin/mongo
# 基本操作
# 通用操作
- 查看数据库
Show databases
- 选择数据库
Use 数据库名
隐式创建:在 mongodb 选择不存在的数据库不会报错,后期当该数据库有数据时,系统会自动创建
- 查看集合
Show collections
- 创建集合
db.createCollection (‘集合名’)
- 删除集合
db. 集合名.drop ()
# C 增
db. 集合名.insert (JSON 数据)
集合存在 - 则直接插入数据,集合不存在 - 隐式创建,创建时会有默认 id,如需自定义,给插入的 JSON 数据增加_id 键即可覆盖
增加多条数据
(JSON 数据) 变为 ([JSON 数据,JSON 数据])
快速插入多条数据
由于 mongodb 底层是 JS 引擎,所以支持部分 JS 语法
for(var i = 1; i < n; i++){
db. 集合名.insert ({name:"a"+i,age:i})
}
# R 查
- 查询全部数据
Db. 集合名.find ()
- 只看 name 列
db. 集合名.find ({},{name:1})
- 除了 name 列
db. 集合名.find ({},{name:0})
第一个 {} 不填表示查询所有
- 查询固定数据
db. 集合名.find ({name:"张三"})
- 查询年龄大于 5 岁的数据
db. 集合名.find ({age:{$gt:5}})
- 查询 5,8,10 岁的数据
db. 集合名.find ({age:{$in:[5,8,10]}})
- 运算符
$gt:大于
$gte:大于等于
$lt:小于
$lte:小于等于
$ne:不等于
$in:in
$nin:not in
# U 改
Db. 集合名.update (条件,新数据,[是否新增,是否修改多条])
- 是否新增
指条件匹配不到数据则插入 (true 是插入,false 否不插入默认)
- 是否修改多条
指将匹配成功的数据都修改 (true 是,false 否默认)
- 修改张三的数据
db. 集合名.update ({name:"zs1"},{$set:{name:"zs2"}}),不加 set 默认是替换而不是修改
- 将张三的年龄加 1
db. 集合名.update ({name:"zs1"},{$inc:{age:1}})
- 修改器
$set:修改列值
$inc:递增
$rename:重命名列
$unset:删除列
# D 删
db. 集合名.remove ({},[是否删除一条])
ture:删除一条,默认 false:全删除
# 拓展操作
- 格式化数据 pretty ()
db. 集合名.find ().pretty ()
- 排序
db. 集合名.find ().sort (JSON 数据)
键 - 就是要排序的字段的列 / 字段、值:1 升序 -1 降序
- 分页
db. 集合名.find ().skip (数字).limit (数字)
skip 跳过指定条数 (可选),limit 限制查询的条数
- 总结
db. 集合名.find ()
.pretty () 格式化数据
.sort ({列:1/-1}) 排序
.skip (数字) 跳过指定条数
.limit (数字) 限制查询条数
.count () 统计总条数
# 聚合查询
Db.集合名.aggregate([
{管道:{表达式}}
……
])
# 常用管道:
- $group
将集合中的文档进行分组,用于统计结果
- $match
过滤数据,只要输出符合条件的文档
- $sort
聚合数据进一步排序
- $skip
跳过指定文档数
- $limit
限制集合数据返回文档数
# 常用表达式
- $sum
总和 $sum:1 同 count 表示统计
- $avg
平均
- $min
最小值
- $max
最大值
# 例子
- 统计男生女生的总年龄:
db.集合名.aggregate([
{
$group:{
_id:"$sex".
result:{$sum:"$age"}
}
}
])
- 统计男生女生的总人数
db.集合名.aggregate([
{
$group:{
_id:"$sex",
num:{$sum:1}
}
}
])
- 求学生总数和平均年龄
db.集合名.aggregate([
{
$group:{
_id:null,
Total_num:{$sum:1},
Avg_age:{$avg:"age"}
}
}
])
- 查询男生女生人数,按人数排序
db.集合名.aggregate([
{
$group:{
_id:"$sex",
num:{$sum:1}
}
},
{
$sort:{
num:1//升序
}
}
])
# 索引
# 创建索引
Db. 集合名.createIndex (待创建索引的列,[额外选项])
待创建索引的列:
说明:1 升序 - 1 降序 例:{age:1} 表示创建 age 索引并按照升序的方式存储
额外选项:设置索引的名称或唯一索引
# 删除索引
- 全部删除
db. 集合名.dropIndexes ()
- 删除指定
db. 集合名.dropIndex (索引名)
# 查看索引
Db. 集合名.getIndexes ()
显示出来的 key:给哪个列设置了索引
显示出来的 name:表示索引名称,默认系统生成,也可以自定义
# 给索引取名
Db. 集合名.createIndex ({“键 ":“值"},{键:“名称 "})
# 添加唯一索引
Db. 集合名.createIndex ({“键 ":“值"},{unique:“键 "})
# 分析索引
Db. 集合名.find ().explain (“executionStats")
# 权限机制
# 创建账号
Use admin
db.createUser({
"user":"admin",
"pwd":"admin",
"roles":[{
role:"root",
db:"admin"
}]
})
# 角色
- 角色种类
超级用户角色:root
数据库用户角色:read、readwrite;
数据库管理角色:dbAdmin、userAdmin;
集群管理角色:clusterAdmin、clusterManager、ClusterMonitor、hostManager;
备份恢复角色:backup、restore;
所有数据库角色:readAnyDatabase、readWriterAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase;
- 角色说明
root:只在 admin 数据库中可用。超级账号、超级权限;
read:允许用户读取指定数据库;
readWriter:允许用户读写指定数据库
# 开启验证模式
# 概念
指用户需要输入账号密码才能登录使用
# 操作步骤
- 添加超级管理员
Use admin | |
db.createUser({ | |
"user":"admin", | |
"pwd":"admin", | |
"roles":[{ | |
role:"root", | |
db:"admin" | |
}] | |
}) |
- 退出卸载服务
Linux:mongod --shutdown
Window:Mongod --remove
- 重新安装需要输入账号密码的服务 (注:在原安装命令基础上加上 —auth 即可)
Linux:bin 目录下
./mongod --dbpath=/usr/local/mongodb/data --logpath= /usr/local/mongodb/logs/mongodb.log --auth --logappend --port=27017 –fork
Window:bin 目录下
mongod --install --dbpath (data 路径) --logpath (log 路径) –auth
- 启动服务 -> 登录测试
Linux:bin 目录下./mongo
Windows:net start mongodb 再输入 mongo 启动
直接启动 show dbs 看不到任何东西
方法 1:mongo 服务 ip 地址:端口号 / 数据库 -u 用户名 -p 密码
方法 2:先登录,选择数据库,输入 db.auth (用户名,密码)
# 例子
添加用户 shop1 可以读 shop 数据库
添加用户 shop2 可以读写 shop 数据库
注意:必须在对应数据库创建用户
- 准备测试数据
use shop
for(var i = 1 ;i <= 10;i++){
db.goods.insert({
"name":"goodsName"+i,
"price":i
})
}
- 查看添加的数据
db.goods.find()
- 添加用户并设置权限
use shop
db.createUser({
"user":"shop1",
"pwd":"shop1",
"roles":[{
role:"read",
db:"shop"
}]
})
db.createUser({
"user":"shop2",
"pwd":"shop2",
"roles":[{
role:"readWrite",
db:"shop"
}]
})
- 查看添加的用户
use admin
db.system.users.find().pretty()
- 登入 shop1 账号
mongo localhost:27017/shop -u shop1 -p shop1
- 查看数据
db.goods.find()
- 尝试插入数据(会报错就对了)
db.goods.insert({
"name":"goodsName11",
"price":11
})
- 登入 shop2 账号
mongo localhost:27017/shop -u shop2 -p shop2
- 查看数据
db.goods.find()
- 尝试插入数据(插入成功)
db.goods.insert({
"name":"goodsName11",
"price":11
})
# 备份还原
备份与还原都在 bin 目录下执行命令
# 备份语法
mongodump -h -port -u -p -d -o
-h:host 服务器 IP 地址 (一般不写,默认本机)
-port: 端口 (一般不写,默认 27017)
-u:user 账号
-p:pwd 密码
-d:databse 数据库 (数据库不写则导出全部)
-o:open 备份到指定目录下
# 例子
- 备份所有数据
mongodump -u admin -p admin -o 备份目录
- 备份指定数据
mongodump -u shop1 -p shop1 -d shop -o 备份目录
# 还原语法
mongorestore -h -port -u -p -d --drop 备份数据目录
-d 不写则还原全部数据
--drop 先删除数据库再导入
# 例子
- 还原所有数据
先删除两个数据库
use test1,db.dropDatabse(),use test2(),db.dropDatabase()
查看剩下的数据库 show dbs
还原数据 mongorestore -u admin -p admin --drop
备份数据目录,重新登录查看效果
- 还原指定数据
mongorestore -u shop2 -p shop2 -d shop –drop 备份目录
# Java 连接 mongodb
- 查看 mongodb 占用的端口
ps -ef | grep mongodb
- 关掉 mongodb
kill -9 端口
- 开启 mongodb 服务
传教 mongo-start.sh 文件并编辑
./mongod --dbpath=/usr/local/mongodb/data --logpath= /usr/local/mongodb/logs/mongodb.log --auth --logappend --port=27017 --bind_ip=0.0.0.0 (设置为所有人可访问) --fork
将该文件设置为可执行文件,chmod +x mongo-start.sh
执行./mongo-start 开启服务
- 在 java 端连接测试
- 导入 pom 依赖
<dependency> | |
<groupId>org.mongodb</groupId> | |
<artifactId>mongodb-driver</artifactId> | |
<version>3.8.2</version> | |
</dependency> |
- 未设置账号密码
// 创建连接 | |
MongoClient client = new MongoClient(IP地址); | |
// 获取操作的数据库 | |
MongoDatabase test1 = client.getDatabase(数据库名); | |
// 获取集合 | |
MongoCollection<Document> collection = test1.getCollection(集合名); | |
// 获取文档的内容 | |
FindIterable<Document> documents = collection.find(); | |
for (Document document : documents){ | |
System.out.println(document.get(字段)); | |
} | |
client.close(); |
- 设置账号密码
// 设置服务器地址和端口号 | |
ServerAddress serverAddress = new ServerAddress(IP地址, 端口号); | |
// 设置用户名、数据库名称、密码 | |
MongoCredential credential = MongoCredential.createCredential("admin", "admin", "admin".toCharArray()); | |
// 通过连接认证获取连接 | |
MongoClientOptions build = MongoClientOptions.builder().build(); | |
MongoClient client = new MongoClient(serverAddress, credential, build); | |
// 获取操作的数据库 | |
MongoDatabase test1 = client.getDatabase(数据库名); | |
// 获取集合 | |
MongoCollection<Document> collection = test1.getCollection(集合名); | |
// 获取文档的内容 | |
FindIterable<Document> documents = collection.find(); | |
for (Document document : documents){ | |
System.out.println(document.get(字段)); | |
} | |
client.close(); |
# SpringBoot 连接 MongoDB
# application.yml
- 不带密码
spring: | |
data: | |
mongodb: | |
database: 数据库 | |
host: IP地址 |
- 密码访问
spring: | |
data: | |
mongodb: | |
database: 数据库 | |
host: IP地址 | |
username: 用户名 | |
password: 密码 | |
authentication-database: 用户名绑定的数据库(admin) |