MongoDB
近期实验室项目使用到Mongo,就深入学习一下Mongo,并顺带学习一下和mysql的区别
MongoDB基础
Mongo 和 关系型数据库的区分
下面是自己总结的几点和mysql的区分:
1、Mysql分表分库 ,需要利用到例如mycat这些分表分库工具,而Mongo因为是文档存储,因此只能横切数据库,就是将大数据按一定规则存放不同的服务器,使用的工具的mongos。
展示mysql使用分表分库的工具类,就不展开说了
2、MongoDB 以前的版本是用的是B树,最新版本的开始采用B+树,mysql的innodb引擎是采用的B+树,而myisam使用是B树。
mongo的连接
Win项目启动,在bin目录下,输入下面命令启动mongo服务.
mongod --dbpath=..\data\db
mongod 前台启动
命令连接数据库:
mongo --host=xxx.xxx.xxx.xxx -port=xxx
常用的命令
show dbs 查看数据库命令
use 数据库名字;
显示集合创建:db.createCollection(name)
查看当前库中的表: show tables
db.mycollection.drop() 删除mycollection集合
文档的插入
(1)单个文档插入 db.collection.insert({“key”:“value”})
多个文件插入: db.collection.insertMany([{document1}, {document2},{document3}])
db.集合.insertOne(<JSON对象>) // 添加单个文档
db.集合.insertMany([{<JSON对象1>},{<JSON对象2>}]) // 批量添加文档
db.集合.insert() // 添加单个文档
查询:
db.collection.find(<query>) 查询所有的文档
db.inventory.find({}).pretty() 返回格式化后的文档
db.collection.findOne(<query>)
可以使用 $slice 返回数组中的部分元素
{ field: ordering} ordering 1 表示由小到大, -1 表示逆向排序
对应 SpringJava中
Criteria n.标准
删除:
删除全部数据
db.comment.remove({})
db.comment.remove({条件}) db.comment.remove({_id:“1”})
统计查询:
db.collection.count(query, options)
统计comment集合的所有的记录数:
db.comment.count()
按条件统计记录数 db.comment.count({userid:“1003”})
条件查询
- 精准等值查询
db.inventory.find( { status: "D" } );
db.inventory.find( { qty: 0 } );
- 多条件查询
db.inventory.find( { qty: 0, status: "D" } );
- 嵌套对象精准查询
db.inventory.find( { "size.uom": "in" } );
- 返回指定字段
db.inventory.find( { }, { item: 1, status: 1 } );
默认会返回_id 字段, 同样可以通过指定 _id:0 ,不返回_id 字段
- 条件查询 and
db.inventory.find({$and:[{"qty":0},{"status":"A"}]}).pretty();
- 条件查询 or
db.inventory.find({$or:[{"qty":0},{"status":"A"}]}).pretty();
SQL | MQL |
---|---|
a<>1 或者 a!=1 | { a : {$ne: 1}} |
a>1 | { a: {$gt:1}} |
a>=1 | { a: {$gte:1}} |
a<1 | { a: {$lt:1}} |
a<=1 | { a: { $lte:1}} |
in | { a: { $in:[ x, y, z]}} |
not in | { a: { $nin:[ x, y, z]}} |
a is null | { a: { $exists: false }} |
db.集合名字.find({“fileld”:{$gt:value}}) //大于:field>value
实例:查询评论点赞数大于700的记录
db.comment.find({likenum:{$gt:NumberInt(700)}})
gt: 大于 greater than
lt: low than小于
gte: >= greater and equal
lte: <=
ne: 不等于
条件连接查询:
$and:[{},{}]
实例:查询评论集合中likenum大于等于700并且小于2000的文档
db.comment.find({KaTeX parse error: Expected '}', got 'EOF' at end of input: and:[{likenum:{gte: NumberInt(700)} },{likenum:{$lte:NumberInt(2000)}} ]})
索引:
db.collection.createIndex(keys, options)语法中 Key 值为你要创建的索引字段,1 为指定按升序创建索引,如果你想按降序来创建索引指定为 -1 即可。
db.comment.createIndex({userid:1}) 参数1:表示升序对userid字段建立索引
创建用户
注意事项:
1、需要在databse下常见一个用户
db.createUser({
user:“admin”,
pwd:“admin”,
roles:[“readWrite”]
})
认证登陆:
db.auth("xidianiot", "xidianiot@123")
常用方法
mongoTemplate.findAll(Student.class): 查询Student文档的全部数据
mongoTemplate.findById(, Student.class): 查询Student文档id为id的数据
mongoTemplate.find(query, Student.class);: 根据query内的查询条件查询
mongoTemplate.upsert(query, update, Student.class): 修改
mongoTemplate.remove(query, Student.class): 删除
mongoTemplate.insert(student): 新增
MongoDB集群和安全
MongoDB的副本集:操作、主要概念、故障转移、选举规则
MongoDB的分片集群:概念、优点、操作、分片策略、故障转移
MongoDB的安全认证
副本集有自动故障恢复功能的主从集群
副本集群还可以做只读服务器,实现读写分离,提高负载
Replica Sets 副本集
(1) 冗余和数据可用性
(2)MongoDB中的复制
主节点接收所有写操作。副本集只能有一个主要能够确认具有{w:“most”} 写入关注的写入。 主要记录其操作日志中的数据集的所有更改,即oplog
(3)主从复制和副本集的区别
主从集群和副本集最大的区别就是副本集没有固定的“主节点”;整个集群中会选出一个“主节点”,当其挂掉的时候又在剩下的从节点中选中其他节点为“主节点”,副本集总有一个活跃点(主,primary)和一个或多个备份节点(从、secondary)
副本集中的类型和角色
两种类型: 主节点:数据操作的主要连接点,可读可写
次要节点:数据冗余备份节点,可以读后选举
三个角色:
Primary主要成员: 主要接收所有写操作
Replicate副本成员:从节点通过复制操作以维护相同的数据集,即备份数据,不可写操作,但可以读操作。是一种默认的从节点类型
Arbiter仲裁者:不保留任何数据的副本,只具有投票选举的作用。当然也可以将冲裁服务器维护为副本集的一部分,即冲裁服务器既是仲裁者又是从节点
创建副本
docker在一台服务器创建是三个副本,并初始化副本集
副本集
docker run -it --name security-mongo1 -p 27118:27017 --restart=always -v /home/securuty-integretion-platform/docker/mongo/data1:/data/db -d mongo:latest --replSet repset
docker run -it --name security-mongo2 -p 27119:27017 --restart=always -v /home/securuty-integretion-platform/docker/mongo/data2:/data/db -d mongo:latest --replSet repset
docker run -it --name security-mongo3 -p 27120:27017 --restart=always -v /home/securuty-integretion-platform/docker/mongo/data3:/data/db -d mongo:latest --replSet repset
进入主节点
mongo 39.101.141.219:27118/admin
初始化副本集
rs.initiate({ _id:"repset", members:[
{_id:0,host:"39.101.141.219:27118"}, {_id:1,host:"39.101.141.219:27119"}, {_id:2,host:"39.101.141.219:27120"}
]})
看副本集合状态
rs.status();
分片集群
分片:就是数据水平的拆分到不同的服务器上。因为mongo是文档存储只能水平拆分。
为什么要使用分片集群?
数据量突破单机瓶颈,数据量大,恢复很慢,不利用数据管理并发量突破单机性能瓶颈
Mongos
Mongos还要从数据节点1和2中取数据,然后再在Mongos中将数据拼接起来。
配置节点:就是普通的mongod进程,建议以副本集部署,提供高可用。存放路由规则,里面放置的也是复制集合。
数据节点:以复制集为单位,横向扩展最大1024分片,分片之间数据不重复,所有数据在一起才能工作。
路由节点:
分片健: 1、范围分片(类似以ID: 0-10,10-20) 2、hash分片 3、时间顺序( 根据时间来分片)
选择片健:
1、片健值得范围要广
2、片健值得分布要平衡
3、片健值不要单向增大、减小(可用使用hash片健)
MongoDB分片集群特点
1.应用全透明
2.数据自动均衡
3.动态扩容,无需下线
Docker启动
docker pull mongo:4.0
docker run --name mongo_xidianiot -v /data/db:/data/db -p 27017:27017 -d mongo:4.0
创建用户
db.createUser({user:"xidianiot", pwd:"xidianiot@123",roles:["root"]})
db.createUser({user:"iot", pwd:"iot",roles:["root"]})