MongoDB
MongoDB简介
简介:是一个开源的、高性能、无模式的文档型数据库。
SQL术语/概念 | MongoDB术语/概念 | 解释说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 不支持 | 表连接,MongoDB不支持 |
不支持 | 嵌入文档 | MongoDB通过嵌入式文档来代替多表连接 |
primary key | primary key | MongoDB默认_id字段为主键 |
MongoDB的特点
- 高性能
- 高可用 :MongoDB的复制工具被称为副本集,它可以提供故障转移和数据冗余
- 高扩展:支持水平扩展
- 丰富的查询支持
MongoDB安装与启动
Window OS
官网下载地址:https://www.mongodb.com/try/download/community-kubernetes-operator
参数的方式启动
#在mongo的bin目录下cmd
mongo -dbpath = /data/db #mongo启动命令
mongo --host=192.168.11.127 --port=27017 #mongo远程连接命令
命令行+配置文件的形式进行启动
- 创建conf文件夹
-
在conf文件夹下创建文件mongod.conf(配置详情看官网)
-
在bin目录下cmd并执行启动命令
mongod -f ../conf/mongod.conf #通过指定配置文件进行启动
mongod --conf ../conf/mongod.conf
MongoD连接
shell 命令进行连接
#连接本地的mongo服务
mongo
#连接远程mongo服务
mongo --host=127.0.0.1 --port=27017
show dbs;#验证是否连接成功
MongoDB常用命令
数据库创建
use 数据库名称 #如果存在,则进行使用,不存在则创建#查看当前存在的数据库
show dbs / show databases#删除数据库
db.dropDatabase()
注:mongoDB在创建数据库时会先将库存储在内存之中,当库中存在数据时,将会把库存储到磁盘中。
默认库的解释
- admin:从权限的角度,这是root数据库。要是将一个用户添加到这个数据库,这个用户会自动继承所在数据库的权限。一些特定的服务器端命令也只能从这个数据库运行
- local:这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合
- config:当mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。
集合的操作
#创建一个普通集合名称
db.createCollection(name)#查看当前库中的表:show tables
show collections 或 show tables#删除集合
db.collectionName.drop()
文档基本CRUD
单个文档的插入
使用insert()或save()方法向集合中插入文档
db.collection.insert(<document or array of document>,{writeConcern:<docement>,ordered:<boolean>}
)
参数
parameter | Type | Descrption |
---|---|---|
document | document or array | 要插入到集合的文档或文档数组(json格式) |
writeConcern | document | 插入时性能及可靠性的级别 |
ordered | boolean | 是否排序 |
例子
db.myCollection.insert({name:"小明",age:"25"})
多个文档的插入
db.collection.insertMany([<document 1> <document 2>,....]{writeConcern:<document>,ordered:<boolean>}
)
文档的基本查询
db.collection.find()
或
db.collection.find({})#例,仅查询一个
db.collection.findOne({name:"小明"}) #表示仅查询name为小明的这一条信息
或
db.collection.find({name:"小明"}) #表示仅查询name为小明的这一条信息
文档的投影查询(仅查询一条数据的部分字段)
db.collection.find({name:"小明"},{name:"小明"}) #表示仅查询name="小明"的这一条数据,并且仅展示name这一个字段#例如查询表中的name这条信息
db.collection.find({},{name:"明"})
注:在进行多条数据进行插入的时候,可以通过 try …catch(e)进行异常抛出
try {db.collection.insertMany({....})
} catch(e) {print(e)
}
文档的更新
db.conllection.update(query,update,optione)
或
db.collection.update(<query>, #查询条件<update>, #更新条件{upsert:<boolean>,multi:<boolean>,writeConcern:<document>,collation:<document>,arrayFilters:[<filterdocument>,.....],hint:<document|string>}
)
-
覆盖修改
#表示,将_id为1的这条数据的age字段的值改为38 注:在进行数字修改时,mongo默认数字为浮点型,如需要整数型,需进行修改 db.collection.update({_id:"1"},{age:NumberInt(38)}) #注:这条语句可以成功将age的值修改为38,但是会删掉name字段,这便是覆盖修改,会将原来的数据完全修改
-
局部修改
#表示,仅修改_id为2的这条数据的age字段,其余字段不受影响 db.collection.update({_id:"2"},{$set:{age:NumberInt(38)}})
-
批量修改
#注:mongoDB的修改操作,默认只修改第一条 db.collection.update({_id:"1"},{$set:{age:NumberInt(38)},{multi:true}}) #表示修改所有符合条件的值,并且仅作局部修改
-
列值增长的修改
#表示,对_id=1的年龄进行修改,并且年龄随着条数进行递增加1 db.collection.update({_id:"1"},{$inc:{age:NumberInt(1)}})
删除文档
db.collection.remove({}) #删除所有
db.collection.remove({_id:"1"}) #删除_id=1的数据
文档的分页查询
统计查询
统计查询count()方法
db.collection(query,options)
参数解释
parameter | Type | Description |
---|---|---|
query | document | 查询选择条件 |
options | document | 可选,用于修改计数的额外选项 |
db.collection.count() #查询总条数db.collection.count({_id:"1"}) #查询_id=1的条数
分页列表查询
#表示查询前两条,limint默认的值为20
db.collection.find().limit(2) #表示从跳过前三条,从第四条进行查询,查询三条信息
db.collection.find().skip(3).limit(3)
排序查询
#根据_id进行排序,值为1是升序,-1表示为降序
db.collection.find().sort({_id:1})
正则的复杂的条件查询
#表示进行模糊查询
db.collection.find({field:/正则表达式/})
或
db.collection.find({字段:/正则表达式/})
比较查询
db.collection.find({"field":{$gt:value}}) #大于:field > value
db.collection.find({"field":{$lt:value}}) #小于:field < value
db.collection.find({"field":{$gte:value}}) #大于等于: field >= value
db.collection.find({"field":{$lte:value}}) #小于等于: field <= value
db.collection.find({"field":{$ne:value}}) #不等于:field != value#实例:注:mongo默认数字为浮点数需要转换为整型
db.collection.find({"field":{$gt:NumberInt(700)}}) #
包含查询
#字段in
db.collection.find({age:{$in:["23","25"]}})#字段not in
db.collection.find({age:{$nin:["1003","1004"]}})
条件连接查询
db.collection.find({$and:[{age:{$lt:NumberInt(25)}},{name:"小明"}]})db.collection.find({$or:[{age:{$lt:NumberInt(23)}},{age:{$lt:NumberInt(24)}}]})
MongoDB索引
索引的创建
db.collection.createIndex(keys,options)
参数:
Parameter | Type | Description |
---|---|---|
keys | document | 包含字段和值对的文档,其中字段是索引值,值描述该字段的索引类型。对于字段上的升序索引,请指定值1;对于降序索引,请指定-1 |
options | document |
索引的删除
#根据条件删除索引
db.collection.dropIndex({user_id,1})#删除所有索引
db.collection.dropIndexs()
索引的使用
语法:
db.colection.find(query,options).explain(options)
MongoDB副本集
副本集的目标
目标:一主一副本一仲裁
创建主节点
建立存放数据和日志目录
mkdir -p /data/mongo/logs
mkdir -p /data/mongo/db
mkdir -p /data/mongo/mongod.conf
systemLog:# 日志文件存储位置destination: filepath: "/data/mongo/logs/mongod.log"logAppend: true
storage:#mongoDB数据存储目录dbpath: "/data/mongo/db"journal:enabled: true
processManagement:#启用在后台运行mongos或mongod进程的守护进程模式frok: true#指定用于保存mongos或mongod进程的进程ID的文件位置,其中mongos或mongod将写入PID中pidFilePath: "/data/mongo/logs/mongod.pid"
net:#服务实例绑定所有IP,有副作用,副本集在进行初始化的时候,节点名字会自动设置为本地域名,而不是IP#bindIpAll: truebingIp: localhost,192.168.0.2port: 27017
relication:replSetName: rs0
启动主节点
/data/mongo/bin/mongod -f /data/mongo/mongod.conf
注:副本节点与仲裁节点进行一样的操作
mongo初始化
在节点都启动完成之后,任选一个节点,远程连接
#连接mongo 注:执行mongo命令需要在mongo的bin目录下进行执行
/dada/mongo/bin mongo --host=192.168.10.29 --port=27017#mongo副本集初始化 返回1表示成功
rs.initiate();#查看初始化默认配置
rs.conf()#添加副本节点,host:表示IP与端口号 arbiterOnly为true表示添加的为仲裁节点,false为副本集节点
rs.add(host,arbiterOnly)
或
rs.add(host) #添加副本集节点
rs.addArb(host) #添加仲裁节点#查看副本集状态
rs.status();
主节点的选举原则
在mongo的副本集中,会自动进行主节点的选举,主节点选举触发的条件
- 主节点故障
- 主节点的网络不可达(默认心跳信息为10s)
- 人工干预(rs.stepDown(600)) ,表示管理此服务
注:在进行获取票的时候,优先级(priority)参数影响重大,因此可以设置优先级(priority)来设置额外的票数。优先级即权重,取值0-1000,相当于可以额外增加0-1000的票数,优先级的值越大,就越可能获得多数成员的投票数
分片集群-Sharded Cluster
简介:分片是一种跨多台机器分布数据的方法,MongoDB使用分片来支持具有非常大的数据集和高吞吐量操作的部署
副本集搭建 --一主一副本一仲裁
systemLog:# 日志文件存储位置destination: filepath: "/data/mongo/logs/mongod.log"logAppend: true
storage:#mongoDB数据存储目录dbpath: "/data/mongo/db"journal:enabled: true
processManagement:#启用在后台运行mongos或mongod进程的守护进程模式frok: true#指定用于保存mongos或mongod进程的进程ID的文件位置,其中mongos或mongod将写入PID中pidFilePath: "/data/mongo/logs/mongod.pid"
net:#服务实例绑定所有IP,有副作用,副本集在进行初始化的时候,节点名字会自动设置为本地域名,而不是IP#bindIpAll: truebingIp: localhost,192.168.0.2port: 27017
relication:replSetName: rs0
#分片角色
sharding:clusterRole: shardsvr
配置副本集搭建 -Config Server
systemLog:# 日志文件存储位置destination: filepath: "/data/mongo/logs/mongod.log"logAppend: true
storage:#mongoDB数据存储目录dbpath: "/data/mongo/db"journal:enabled: true
processManagement:#启用在后台运行mongos或mongod进程的守护进程模式frok: true#指定用于保存mongos或mongod进程的进程ID的文件位置,其中mongos或mongod将写入PID中pidFilePath: "/data/mongo/logs/mongod.pid"
net:#服务实例绑定所有IP,有副作用,副本集在进行初始化的时候,节点名字会自动设置为本地域名,而不是IP#bindIpAll: truebingIp: localhost,192.168.0.2port: 27017
relication:replSetName: myconfig
#分片角色
sharding:clusterRole: configvr
路由节点的创建和连接
#准备存放数据和日志目录
mkdir -p /mongodb/sharded_cluster/mymongos_27017/log#新建或修改mongo配置文件
vim /mongodb/sharded_cluster/mymongos_27017/mongos.conf
mongos.conf
systemLog:# 日志文件存储位置destination: filepath: "/data/mongo/logs/mongod.log"logAppend: true
storage:#mongoDB数据存储目录dbpath: "/data/mongo/db"journal:enabled: true
processManagement:#启用在后台运行mongos或mongod进程的守护进程模式frok: true#指定用于保存mongos或mongod进程的进程ID的文件位置,其中mongos或mongod将写入PID中pidFilePath: "/data/mongo/logs/mongod.pid"
net:#服务实例绑定所有IP,有副作用,副本集在进行初始化的时候,节点名字会自动设置为本地域名,而不是IP#bindIpAll: truebingIp: localhost,192.168.0.2port: 27017
sharding:#执行配置节点的副本集configDB: myconfig/+配置副本集的三个服务
#配置副本集的启动命令
/usr/local/mongodb/bin/mongos -f /mongodb/sharded_cluster/mymongos_27017/mongos.conf
使用 命令添加分片
sh.addShard("IP:port")#例 分片添加
sh.addShard("myShard01/192.168.10.1:27017,192.168.10.2:27017,192.168.10.3:27017") #查看分片状态
sh.status()#注:如果分片添加失败,需要进行手动的移除分片,检查添加分片的信息的正确性后,再次添加分片
use admin
db.runCommand({removeShard:"myShard01"})#注:如果只剩下最后一个shard,是无法进行删除的
#在进行移除时,会自动转移分片的数据,需要一个时间的过程,转移完成后,再次执行分片命令才能真正的删除#----开启分片功能
sh.enableSharding("库名")sh.shardCollection("库名.集合名",{"key":1})
集合分片
sh.shardCollection(namespace,key,unique)
parameter | Type | Description |
---|---|---|
namespace | string | 要(分片)共享的目标集合的命名空间,格式. |
key | document | 用作分片键的索引规范文档。shard键决定MongoDB如何在shard之间分发文档。除非集合为空,则MongoDB在集合进行分片之前创建索引,前提是支持分片键的索引不存在,简单说,由包含字段和该字段的索引遍历方向的文档组成。 |
unique | boolean | 当值为true情况下,片键字段上会限制为确保是唯一索引,哈希策略片键不支持唯一索引。默认是false |
分片规则 - 哈希策略
sh.shardCollection("articledb.comment",{"nickname":"hashed"})#nickename 字段名称
分片规则 - 范围策略
sh.shardCollection("articledb.author",{"nickname":1})
或
sh.shardCollection("articledb.author",{"nickname":-1})
注:在进行设置分片规则时,一个集合只能设置一个规则策略
在增加一个路由节点
#准备存放数据和日志目录
mkdir -p /mongodb/sharded_cluster/mymongos_27017/log#新建或修改mongo配置文件
vim /mongodb/sharded_cluster/mymongos_27017/mongos.conf
mongos.conf
systemLog:# 日志文件存储位置destination: filepath: "/data/mongo/logs/mongod.log"logAppend: true
storage:#mongoDB数据存储目录dbpath: "/data/mongo/db"journal:enabled: true
processManagement:#启用在后台运行mongos或mongod进程的守护进程模式frok: true#指定用于保存mongos或mongod进程的进程ID的文件位置,其中mongos或mongod将写入PID中pidFilePath: "/data/mongo/logs/mongod.pid"
net:#服务实例绑定所有IP,有副作用,副本集在进行初始化的时候,节点名字会自动设置为本地域名,而不是IP#bindIpAll: truebingIp: localhost,192.168.0.2port: 27018
sharding:#执行配置节点的副本集configDB: myconfig/+配置副本集的三个服务
注:多个路由的添加,仅需要修改路由的端口号,其他信息一致
安全认证
MongoDB的用户和角色权限认证
注:默认情况下,MongoDB实例启动运行时时没有启动用户访问权限控制的,也就是说,MongoDB不会对连接的客户端进行用户验证
mongoDB安全策略设置
- 使用新的端口号,不适用默认27017的端口
- 部署于内网之中
- 开启安全认证 即:auth=true
MongoDB的权限框架-角色
mongoDB采用角色和权限的架构进行相关的认证,在mongo中通过角色对用户授予响应数据库资源的操作权限,每个角色当中的权限可以显式指定,也可以通过继承其他角色的权限,或者两者都存在的权限
MongoDB的权限框架-权限
权限由指定的数据库资源以及运行在指定资源上进行的操作组成
- 资源包括:数据库、集合、部分集合和集群;
- 操作包括:对资源进行增、删、改、查操作
在角色定义时可以包含一个或多个已存在的角色,新创建的角色会继承包含的角色所在的权限。在同一个数据库中,新创建的角色可以继承其他角色的权限,在admin数据库中创建的角色可以继承在其他任意数据库中角色的权限
关于角色权限的查看
#查看所有角色权限(仅用户自定义角色)
db.runCommand({roleInfo:1})#查询所有用户权限(包含内置角色)
db。runCommand({roleInfo:1,showBuiltinRoles:true})#查询当前数据库中某角色的权限
db。runCommand({roleInfo:"<rolename>"})#查询其他数据库中指定的角色权限
db.runCommand({roleInfo:{role:"rolename"},db:"<database>"})
角色说明
- 备份恢复角色:backup、restore
- 超级用户角色:root
- 内部角色:system
角色 | 权限描述 |
---|---|
read | 可以读取指定数据库中任何数据 |
readWrite | 可以读写指定数据库中任何数据,包括创建、重命名、删除集合 |
readAnyDatabase | 可以读取所有数据库中任何数据(除了数据库config和local之外) |
readWriteAnyDatabase | 可以读写所有数据库中任何数据(除了数据库config和local之外) |
userAdminAnyDatabase | 可以在指定数据库创建和修改数据库用户(除了数据库config和local之外) |
dbAdminAnyDatabase | 可以读取任何数据库以及对数据库进行清理、修改、压缩、获取统计信息、执行检查等操作(除了数据库config和local之外) |
dbAdmin | 可以读取指定数据库以及对数据库进行清理、修改、压缩、获取统计信息、执行检查等操作 |
userAdmin | 可以在执行数据库创建和修改用户 |
clusterAdmin | 可以对整个集群或数据库系统进行管理操作 |
backup | 备份MongoDB数据最小的权限 |
restore | 从备份文件中还原回复MongoDB数据(除了system.profile集合)的权限 |
root | 超级账号、超级权限 |
单实例环境下 -安全认证的操作
目标:对单实例的MongoDB服务开启安全认证,这里的单实例是指为开启副本集或分片的MongoDB实例
-
关闭已经开启的服务
-
快速关闭的方法 --通过kill直接杀死相关进程
-
注:如果一旦因为数据损坏,则需要进行文件修复
#删除lock文件 rm -rf /data/mongo/data/db/*.lock#数据恢复 /usr/local/mongodb/bin/mongod --repair --dbpath=/data/mongo/data/db
-
用户创建
#切换到admin库 use admin#创建超级管理员 db.createUser({user:"myroot",pwd:"123456",roles:["root"]})#创建专门用来管理admin的账号myadmin,只用来作为用户权限管理 db.createUser({user:"myadmin",pwd:"123456",roles:[role:"userAdminAnyDatabase",db:"admin"]})#查看已经创建的用户 db.system.user.find();#删除用户 db。dropUser("myadmin")#修改密码 db.changeUserPassword("myroot","123456")
-
注:mongo开启用户认证时,需要先不开启认证,启动服务创建好用户之后在进行认证开启
-
快速关闭的方法 --通过kill直接杀死相关进程
-
注:如果一旦因为数据损坏,则需要进行文件修复
#删除lock文件 rm -rf /data/mongo/data/db/*.lock#数据恢复 /usr/local/mongodb/bin/mongod --repair --dbpath=/data/mongo/data/db
-
用户创建
#切换到admin库 use admin#创建超级管理员 db.createUser({user:"myroot",pwd:"123456",roles:["root"]})#创建专门用来管理admin的账号myadmin,只用来作为用户权限管理 db.createUser({user:"myadmin",pwd:"123456",roles:[role:"userAdminAnyDatabase",db:"admin"]})#查看已经创建的用户 db.system.user.find();#删除用户 db。dropUser("myadmin")#修改密码 db.changeUserPassword("myroot","123456")
注:mongo开启用户认证时,需要先不开启认证,启动服务创建好用户之后在进行认证开启