irpas技术客

MongoDB基础_v_BinWei_v

网络投稿 2246

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(); SQLMQLa<>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"]})


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #mongodb基础 #就深入学习一下Mongo #