MongoDB

mongoDB

一、MongoDB的引言
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 Nosql 技术门类 redis 内存型 mongodb 文档型
在这里插入图片描述

	MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
	![mogog-blog.csdnimg.cn/201912081322264.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwODI4NzA1,size_16,color_FFFFFF,t_70)

二、MongoDB的特点
面向集合存储,易存储对象类型的数据
支持查询,以及动态查询
支持RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言
文件存储格式为BSON(一种JSON的扩展)
支持复制和故障恢复和分片
没有事务
日志

mongonDB引言32分钟

三、MongoDB的安装和使用
1.下载mongoDB的安装包(最新版本3.6,只能在64位系统安装)这里使用的3.0.6版本

2.上传至linux系统中解压当前的linux系统

3.将解压的文件为了方便目录进行重命名(这步可以跳过)

4.进入mongodb的文件夹中查看目录

5.在bin目录中存在大量mongodb使用的命令

6.启动mongoDB数据库服务
./mongod --port 27017 --dbpath /root/data

注意:
启动时要求存放数据的目录必须存在
默认的端口号是27017 可以通过–port 指定端口启动

7.出现如下结果代表启动成功

四、MongoDB的shell(客户端)操作
1.进入mongo的bin目录中找到如下指令

2.使用如下命令连接到mongodb的服务中

注意:
a)连接到mongodb后,mongo和mysql数据库有点像,先是一个一个库的概念,操作之前需要先选中库

3.查看系统中默认的所有库
show dbs;

注意:
默认只有一个local库
还有一个默认隐藏不可见的数据库 admin
4.选中一个库
a)use 数据库名称

注意:
use命名 存在库使用当前库 不存在则创建当前库

5.删除一个库
db.dropDatabase();

注意: 选中那个库,删除的就是当前选中的库

6.Mongodb的数据库中,库中是一个一个集合的概念,选中库后要创建一个一个的集合,集合类似于传统的关系型数据库中的表
a)显示创建集合 db.createCollection(“t_user”);

b)隐式创建集合 创建集合同时添加元素

7.查看mongo 中当前库
a)db 命令显示当前库

8.显示当前库中的所有集合
a)show collections;

9.Mongo中插入数据
a)向集合中插入数据
db.集合名称.insert({name:‘xiaohei’,age:23,sex:true});
b)向集合中插入多条数据
db.集合名称.insert([{name:‘xiaohei’,age:23,sex:true},…]);
10.Mongo中的删除数据
a)db.集合名称.remove({条件}) //删除满足条件的数据
b)db.集合名称.remove({不加任何条件})//删除所有文档 保留空的集合
11.Mongo中的修改数据
a)db.集合名称.update({条件},{更新内容});
b)db.集合名称.update({“name”:“zhangsan”},{name:“11”,bir:new date()}) --这个更新是将符合条件的全部更新成后面的文档,相当于先删除在更新
c)db.集合名称.update({“name”:“xiaohei”},{KaTeX parse error: Expected 'EOF', got '}' at position 22: …ame:"mingming"}}̲) --保留原来的值修改…set:{name:”小明”}},{multi:true}) —保留原来数据更新,更新符合条件的所有数据
e)db.集合名称.update({name:”小黑”},{KaTeX parse error: Expected 'EOF', got '}' at position 16: set:{name:”小明”}}̲,{multi:true,up…inc:{age:1}},{upsert:true,multi:true}) --在保留原始数据同时给符合条件的所有age这列的值自增指定的大小
g)
12.删除集合
a)db.集合名称.drop();
13.查询集合
a)db.集合名称.find();
b)db.集合名称.find({条件})
c)db.集合名称.find({条件},{显示字段,name:1,age:1}) 1 显示 0 不显示 1和0 不能混合出现
d)查询结果排序:db.集合名称.find().sort({条件name:1,age:1}), 1 升序 -1 降序
e)分页查询:db.集合名称.find().sort({条件}).skip(起始条数).limit(显示总记录数);
f)总条数:db.集合名称.count();|db.t_user.find({“name”:“aa”}).count();
g)模糊查询:使用正则表达式db.集合名称.find({“name”:/go/})
h)等值(==)查询
db.user.find({name:“张三”});
db.user.find({name:{KaTeX parse error: Expected 'EOF', got '}' at position 8: eq:"张三"}̲}); i)且 (and) 查询
db.t_user.find({name:“zhangsan”,age:12});
db.t_user.find({KaTeX parse error: Expected 'EOF', got '}' at position 32: …gsan"},{id:10}]}̲) j)or使用:
i.
db.集合名称.find({
KaTeX parse error: Expected '}', got 'EOF' at end of input: …y:value},{age:{gte:20}}
]
});
k)$gt大于 $gte大于等于 $lt 小于 $lte 小于等于 KaTeX parse error: Expected '}', got 'EOF' at end of input: ….find({“age”:{“lte”:18,”$gte”:30}})

l)KaTeX parse error: Expected '}', got 'EOF' at end of input: …b.t_user.find({nor:[{name:“chenyn”},{age:26}]});

14.shell非正常关闭时,下次无法连接问题解决方案:
i.删除数据目录中的mongo.lock文件即可

五、Java操作mongoDB
1.项目中引入mongo的坐标

org.mongodb
mongo-java-driver
3.0.0

2.使用java操作mongo
a)参见代码 mongo-java

六、Spring Boot整合mongoDB

1.pom配置
pom包里面添加spring-boot-starter-data-mongodb包引用


org.springframework.boot
spring-boot-starter-data-mongodb

2.在application.properties中添加配置
spring.data.mongodb.uri=mongodb://localhost:27017/test
3.详细操作参见springboot-mongo

mongoDB

一、MongoDB中的索引
索引就是为了加速查询的,MongoDB的索引几乎与传统的关系型数据库一模一样,这其中也包括一些基本的优化技巧。下面是创建索引的命令:

1.创建索引:db.集合名称.ensureIndex({“name”:1})
a)1 代表索引升序存储 -1 代表索引降序存储
b)_id 默认自动创建索引
2.创建索引指定索引名称:db.集合名称.ensureIndex({“name”:1},{name:“name_index”})
3.查看索引是否创建成功:db.集合名称.getIndexes()
4.删除索引的命令:db.集合名称.dropIndex({“name”:1});
5.创建复合索引:db.集合名称.ensureIndex({“name”:1, “age”:-1,bir:1})
a)注意:
i.该索引被创建后,基于name和age的查询将会用到该索引
ii.或者是基于name的查询也会用到该索引
iii.但是只是基于age的查询将不会用到该复合索引。
b)总结:
i.如果想用到复合索引,必须在查询条件中包含复合索引中的前N个索引列。然而如果查询条件中的键值顺序和复合索引中的创建顺序不一致的话,MongoDB可以智能的帮助我们调整该顺序,以便使复合索引可以为查询所用。

ii.如:db.t_user.find({“age”: 30, “name”: “stephen”})
对于上面示例中的查询条件,MongoDB在检索之前将会动态的调整查询条件文档的顺序,以使该查询可以用到刚刚创建的复合索引。

6.创建唯一索引:db.t_user.ensureIndex({“name”:1},{“unique”:true})
注意: 在缺省情况下创建的索引均不是唯一索引。一旦创建唯一索引, 如果再次插入name重复的文档时,MongoDB将报错,以提示插入重复键 (exception: E11000 duplicate key error index: zpark.t_user.$name_1 dup key: { : “xiaohei” })
7.重建索引:db.集合名称.reIndex();

二、mongoDB中的主从复制(4.0版本废弃)
主从复制是mongoDB最常用的复制方式,这种方式非常灵活,可用于备份,故障恢复和扩展等.
1.搭建主从复制
a)准备三个机器一个主机两个备机
mongod --port 27017 --dbpath /root/data/master/ --bind_ip 0.0.0.0 --master --oplogSize 50
mongod --port 27018 --dbpath /root/data/slave1 --bind_ip 0.0.0.0 --slave --source 172.16.19.137:27017 --only baizhi –autoresync
mongod --dbpath /root/data/slave2 --port 27019 --bind_ip 0.0.0.0 --slave --source 172.16.19.137:27017 --only baizhi --autoresync --slavedelay 30
2.主从复制的选项
–master 主节点
–slave 从节点
–source arg 为从节点时从哪个主节点复制server:port
–only arg 为从节点时只复制主节点的那个库
–slavedelay arg 从节点延迟多长时间复制主节点 秒
–autoresync 从机数据不是最新是自动重新同步数据
–oplogSize 主节点的操作日志单位是M

3.查看集群状态:
rs.help();
rs.slaveOk(); //开启从机查询

三、MongoDB中的副本集
MongoDB 副本集(Replica Set)是有自动故障恢复功能的主从集群,有一个Primary节点和一个或多个Secondary节点组成。主从集群和副本集之间最明显的区别就是副本集没有固定的”主节点”,
整个集群会选举一个主节点,当主节点不能工作时自动变更到其他节点.

1.配置主机名
a)vi /etc/hosts文件加入如下配置
i.当前主机地址 mongo
2.搭建副本集
a)准备三个存放数据的目录并启动三个节点
mongod --port 27017 --dbpath /root/repl1 --bind_ip 0.0.0.0 --replSet myreplace/mongo:27018
mongod --port 27018 --dbpath /root/repl2 --bind_ip 0.0.0.0 --replSet myreplace/mongo:27019
mongod --port 27019 --dbpath /root/repl3 --bind_ip 0.0.0.0 --replSet myreplace/mongo:27017
注意: --replSet 副本集 myreplace 副本集名称/集群中其他节点的主机和端口

b)连接任意一台mongo
i.use admin
ii.执行如下命令
var config = {
_id:“myreplace”,
members:[
{_id:0,host:“mongo:27017”},
{_id:1,host:“mongo:27018”},
{_id:2,host:“mongo:27019”}]
}
rs.initiate(config);//初始化配置

c)设置客户端临时访问数据:rs.slaveOk();

Springboot 操作副本集
spring.data.mongodb.uri=mongodb://127.0.0.1:27017,127.0.0.1:27018,127.0.0.1:27019/ems(库名)?replcaSet=spock(副本集名称)
四、Mongodb中的分片
1.分片(sharding)
分片目的是通过分片能够增加更多机器来应对不断的增加负载和数据,还不影响应用.

分片(sharding)是指将数据拆分,将其分散存在不同机器的过程,有时也用分区(partitioning)来表示这个概念,将数据分散在不同的机器上,不需要功能强大的大型计算机就能存储更多的数据,处理更大的负载.
MongoDB支持自动分片,可以摆脱手动分片的管理困扰,集群自动切分数据做负载均衡.MongoDB分片的基本思想就是将集合拆分成多个块,这些快分散在若干个片里,每个片只负责总数据的一部分,应用程序不必知道哪些片对应哪些数据,甚至不需要知道数据拆分了,所以在分片之前会运行一个路由进程,mongos进程,这个路由器知道所有的数据存放位置,应用只需要直接与mongos交互即可,mongos自动将请求转到相应的片上获取数据.从应用角度看分不分片没有什么区别.

2.什么时候分片
a)机器磁盘不够用了
b)单个的mongo已经不能满足写数据的性能需要了

3.mongoDB的分片架构图

Shard:用于存储实际的数据块,实际生产环境中一个shard server角色可由几台机器组个一个replica set承担,防止主机单点故障
Config Server:mongod实例,存储了整个 ClusterMetadata。
Query Routers:前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用。

4.片键
设置分片时需要在集合中选一个键,用该键的值作为拆分数据的依据,这个片键称之为(shard key)
注意: 在真正的生产环境中,片键的选取很重要,片键的选取要一定要数据散列均匀
5.搭建分片集群
a)分片结构的端口如下
Shard Server 1:27020
Shard Server 2:27021
Shard Server 3:27022
Shard Server 4:27023
Config Server :27100
Config Server :27101
Config Server :27102
Route Process:40000

b)创建数据目录
mkdir -p /root/shard/s0
mkdir -p /root/shard/s1
mkdir -p /root/shard/s2
mkdir -p /root/shard/s3
mkdir -p /root/shard/config1
mkdir -p /root/shard/config2
mkdir -p /root/shard/config3

c)创建数据目录并启动四台shard机器
mongod --port 27020 --dbpath /root/shard/s0 --bind_ip 0.0.0.0 --shardsvr
mongod --port 27021 --dbpath /root/shard/s1 --bind_ip 0.0.0.0 --shardsvr
mongod --port 27022 --dbpath /root/shard/s2 --bind_ip 0.0.0.0 --shardsvr
mongod --port 27023 --dbpath /root/shard/s3 --bind_ip 0.0.0.0 --shardsvr
d)创建config数据目录启动配置机器
mongod --port 27100 --dbpath /root/shard/config1 --bind_ip 0.0.0.0 --replSet config/mongo:27101 --configsvr
mongod --port 27101 --dbpath /root/shard/config2 --bind_ip 0.0.0.0 --replSet config/mongo:27102 --configsvr
mongod --port 27102 --dbpath /root/shard/config3 --bind_ip 0.0.0.0 --replSet config/mongo:27100 --configsvr
e)初始化config的配置服务器副本集
i.登录任意config的server节点中使用 use admin
ii.config在admin中执行
var config = {
_id:“config”,
configsvr: true,
members:[
{_id:0,host:“mongo:27100”},
{_id:1,host:“mongo:27101”},
{_id:2,host:“mongo:27102”}]
}
iii.初始化副本集配置 rs.initiate(config);

f)启动路由
i.mongos --port 40000 --configdb config/mongo:27100,mongo:27101,mongo:27102 --bind_ip 0.0.0.0
注意: config为上面的副本集名称
g)客户端登陆到mongos中 mongo –port 40000
i.use admin
ii.添加分片节点:
db.runCommand({ addshard:“mongo:27020”,“allowLocal”:true });
db.runCommand({ addshard:“mongo:27021”,“allowLocal”:true });
db.runCommand({ addshard:“mongo:27022”,“allowLocal”:true });
db.runCommand({ addshard:“mongo:27023”,“allowLocal”:true });

h)设置分片的库:db.runCommand({ enablesharding:“baizhi” });
i)设置那个库中那个集合以及片键信息:
db.runCommand({ shardcollection: “baizhi.users”, key: { _id:1}})
db.runCommand({ shardcollection: “baizhi.users”, key: { _id: “hashed”}})

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值