MongoDB基础

MongoDB

近期实验室项目使用到Mongo,就深入学习一下Mongo,并顺带学习一下和mysql的区别

MongoDB基础

在这里插入图片描述

Mongo 和 关系型数据库的区分

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vje2gN4Z-1639474859529)(G:\技术积累\mongoDB.assets\image-20211210101922125.png)]

下面是自己总结的几点和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”})

条件查询

  1. 精准等值查询
 db.inventory.find( { status: "D" } );
 db.inventory.find( { qty: 0 } );
  1. 多条件查询
db.inventory.find( { qty: 0, status: "D" } );
  1. 嵌套对象精准查询
db.inventory.find( { "size.uom": "in" } );
  1. 返回指定字段
db.inventory.find( { }, { item: 1, status: 1 } );
默认会返回_id 字段, 同样可以通过指定  _id:0 ,不返回_id 字段
  1. 条件查询 and
db.inventory.find({$and:[{"qty":0},{"status":"A"}]}).pretty(); 
  1. 条件查询 or
db.inventory.find({$or:[{"qty":0},{"status":"A"}]}).pretty();
SQLMQL
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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TyljBRbB-1639474859530)(G:\技术积累\mongoDB.assets\clipboard.png)]

(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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yc1pGAfQ-1639474859535)(G:\技术积累\mongoDB.assets\image-20211210202434304.png)]

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"]})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值