MongoDB

发布于:2024-11-29 ⋅ 阅读:(26) ⋅ 点赞:(0)

MongoDB

MongoDB简介

简介:是一个开源的、高性能、无模式的文档型数据库。

image-20241115141410540

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远程连接命令

image-20241115144112174

命令行+配置文件的形式进行启动

  • 创建conf文件夹

image-20241115144431783

  • 在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副本集

副本集的目标

image-20241119170706960

目标:一主一副本一仲裁

创建主节点

建立存放数据和日志目录

mkdir -p /data/mongo/logs
mkdir -p /data/mongo/db
mkdir -p /data/mongo/mongod.conf
systemLog:
	# 日志文件存储位置
	destination: file
	path: "/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: true
	bingIp: localhost,192.168.0.2
	port: 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使用分片来支持具有非常大的数据集和高吞吐量操作的部署

image-20241120160956477

副本集搭建 --一主一副本一仲裁

systemLog:
	# 日志文件存储位置
	destination: file
	path: "/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: true
	bingIp: localhost,192.168.0.2
	port: 27017
relication:
	replSetName: rs0
#分片角色	
sharding:
	clusterRole: shardsvr

配置副本集搭建 -Config Server

systemLog:
	# 日志文件存储位置
	destination: file
	path: "/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: true
	bingIp: localhost,192.168.0.2
	port: 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: file
	path: "/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: true
	bingIp: localhost,192.168.0.2
	port: 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: file
	path: "/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: true
	bingIp: localhost,192.168.0.2
	port: 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开启用户认证时,需要先不开启认证,启动服务创建好用户之后在进行认证开启