springBoot配置mongo
前言
MongoDB基本的角色
1.数据库用户角色: read、readWrite:
2.数据库管理角色: dbAdmin、dbOwner、userAdmin;
3.集群管理角色: clusterAdmin、clusterManager、clusterMonitor、hostManager;
4.备份恢复角色: backup、restore;
5所有数据库角色: readAnvDatabase、 readWriteAnDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
6.超级用户角色: root
//这里还有几个角色间接或直接提供了系统超级用户的访问 (dbOwner 、userAdmin、userAdminAnyDatabase)
userAdminAnyDatabase: 有分配角色和用户的权限,但没有查写的权限。
如果一个用户是userAdminAnDatabase的角色,是可以分配角色和用户的,但是不能查写其他数据库里的数据,会报如下错误:要查写其它数据库的数据可以设置为root角色。
mongo官方文档
1. 单点
1.1 配置
#mongoDB
spring.data.mongodb.uri 这个配置在集群中说明
spring.data.mongodb.host=127.0.0.1
spring.data.mongodb.port=27017
spring.data.mongodb.username=test
spring.data.mongodb.password=gxcxGXL@456
spring.data.mongodb.database=test
spring.data.mongodb.authentication-database=admin此配置只在没有uri的时候生效
logging.level.org.springframework.data.mongodb.core=DEBUG
1.2 问题与操作
1.2.1 用户权限
1.2.1.1 连接mongo
注意用户名跟密码
./mongo host:port --authenticationDatabase admin -u admin -p
1.2.1.2 查询当前使用db
db
1.2.1.3 切换db
use admin
1.2.1.4 查看db用户
show users
1.2.1.5 用户认证
db.auth(‘username’,’password’)
1.2.1.6 创建用户
注意这里在创建用户的时候给的权限不可以是userAdminAnyDatabase此角色权限只有操作数据库权限没有读写权限-------------->见前言
注意创建用户时使用的数据库与上面配置认证的数据库
db.createUser(
{
user: "test",
pwd: "pwd",
roles: [ { role:"readWrite",db:"admin" },{role:"readWrite",db:"test" } ]
}
)
1.2.1.7 当权限不足时新增权限
db.grantRolesToUser("username",[{role:"role",db:"db"}])
1.2.1.8 删除用户
db.dropUser('test')
1.2.2 数据操作
1.2.2.1 查看所有集合
show collections/show tables
1.2.2.1 统计总数
db.tsjc.stats().count
1.2.2.1 分组求count
db.tenderProjectInfo.aggregate([{"$group" : {_id:"$column", count:{$sum:1}}},{ $sort: { count: -1 } }])
1.2.2.2 查看集合字段类型
db.typeCollection.aggregate([{$project:{decimal:{$type:"decimal"}}}])
1.2.2.3 查看集合数据
db.tsjc.find()
美化
db.tsjc.find().pretty()
过滤
db.tsjc.find({“key”:”value”}).pretty()
id查询有时需要带ObjectId()
db.unit_business_info.find({_id:ObjectId('65bb9ab426cfab288cc2d6bf')})
1.2.2.4 删除集合数据
db.tsjc.remove({“key”:”value”})
db.tsjc.deleteMany({});
1.2.2.5 插入数据
post = {"title":"My First Post","content":"hello word!","date":new Date()}
db.tsjc.insert(post)
1.2.2.6 更新数据
post.comments = []
db.test.update({"title":"My First Post"},post)
db.test.update({name:"zhangsan"},{$set:{name:"xiaohong"}});
1.2.3 数据恢复
1.2.3.1 数据导入
*mongo 数据备份前创建的用户 在备份后会被初始化成之前的用户 *
列:A dunp后导入B。 B中用户 test prod。A中用户 admin cs B 在数据恢复完 后就会变成 admin cs 之前的用户会被覆盖
-authenticationDatabase 认证的库:创建用户时所在的数据库
-d : 要恢复到的数据库名
./mongorestore -u username -p password --port=27017 --host=host --authenticationDatabase admin -d dbname --drop /mnt/backup/mongo/test
库名不一样备份还原
./mongorestore -h 127.0.0.1 --port 27017 --drop --nsFrom "test.*" --nsTo "release.*" data -u username -p password --authenticationDatabase admin
2. 集群
2.1 配置
集群配置只能使用uri 不能采用host
#mongoDB
spring.data.mongodb.uri=mongodb://username:password@host:port,host:port/dbname?replicaSet=nangang&readPreference=secondaryPreferred&connectTimeoutMS=10000
2.1 问题
使用uri配置时下面认证数据库不生效
spring.data.mongodb.authentication-database=admin
会直接使用连接中的dbname进行认证
所以在连接时一定要确认数据库中是否存在对应角色
或者可以直接在mongo连接时使用此uri
./mongo ‘mongodb://username:password@host:port,host:port/dbname?replicaSet=nangang&readPreference=secondaryPreferred&connectTimeoutMS=10000’
2.1.1 密码带@问题
由于连接是取得@后面作为host与port需要将用户名跟密码进行urlEncoder
2.1.2 readPreference
readPreference 主要控制客户端driver从副本集(Replica Set)读数据的时候如何路由,如下图。这个特性可以方便的配置读写分离、就近去读等策略。
各个配置的含义如下:
(1)primary:只主(默认模式)。只从primary节点读数据。
(2)primaryPreferred:先主后从。优先从primary读取,primary不可用时从secondary读。
(3)secondary:只从。只从副本集中secondary节点读数据。
(4)secondaryPreferred:先从后主。优先从secondary读取,如果secondary不可用时就从primary读。
2.1.3 使用readPreference需要知道的一些点
(1)除了primary模式以外的其他模式可能返回的数据都不是那么实时,因为从primary进行副本操作到secondary是异步操作。因此在你选中primary以外模式的时候请确保你的程序能够忍受这种stale(不新鲜)。
(2)当然也可以通过设置一些选项(如maxStalenessSeconds)来避免从secondary节点读出来的数据过于“stale”。
该选项不适应于primary模式,这个比较好理解只有选择从节点成员读取操作才能应用。当选择使用maxStalenessSeconds进行读操作,客户端会通过比较从节点和主节点的最后一次写时间来估计从节点的过期程度;客户端会把链接指向估计落后小于等于maxStalenessSeconds的从节点。另外需要注意的是选项值要大于等于90秒,较小的值可能会刨异常。客户端通过定期检查每个副本集成员的最后一次写操作时间估计过期程度,因为检查不频繁,所以只是一个相对粗略的估计。