mongodb入门
基本介绍
MongoDB:是
一个数据库 ,高
性能、无模式、文档性,目前no
sql中最热门的
数据库,开源产品,基于c++开发。是no
sql数据库中
功能最丰富,最像关系
数据库的。
为什么mongodb很耗内存?读和写都是基于内存的
特性
1.面向集合文档的存储:适合存储Bson(json的扩展)形式的数据
2.格式自由,数据格式不固定,生产环境下
修改结构都可以不影响程序运行;
3.强大的
查询语句,面向对象的
查询语言,基本覆盖
sql语言所有能力
4.完整的索引
支持,
支持查询计划
5.
支持复制和
自动故障转移
6.
支持二进制数据及大型对象(
文件)的高效存储
7.使用分片集群提升系统扩展性
8.使用内存映射存储引擎,把磁盘的IO操作转换成为内存的操作
相对关系型
数据库结构
mongo实例->库->集合->文档
基础概念
数据库
集合
文档:最大16M
索引
数据类型
null
{"key":null}
null表示空值或者不存在该字段
布尔
{"key","true"}
布尔类型表示真或者假
32位整数
{"key":8}
存储32位整数,但再shell界面
显示会被
自动转成64位浮点数
64位整数
{"key":{"floatApprox":8}}
存储64位整数,floatApprox意思是使用64位浮点数近似表示
一个64位整数
对象ID
{"key":ObjectId()}
12字节的唯一ID
日期
{"key":new Date()}
代码
{"key":function(){}}
二进制数据
未定义
{"key":undefined}
数组
{"key":[16,15,17]}
内嵌文档
{"user":{"name":"lison"}}
Decimal128
{"price":NumberDecimal("2.099")}
mongodb进阶
启动
配置文件
常用命令
show dbs :
显示数据库列表
show collections :
显示集合列表
db :
显示当前
数据库
db.stats() :
显示数据库信息
db.serverStatus() : 查看服务器状态
db.dropDatabase():
删除数据库
db.help(),db.collection.help():内置帮助,
显示各种
方法的说明;
db.users.find().size(),db.users.count():
获取查询集合的
数量;
db.users.drop():
删除集合
包括索引;
db.users.remove(); 仅
删除集合的数据
db.shutdownServer() 优雅关机
nohup ./mongod -f mongodb.conf & :
配置文件方式启动mongo
./mongo localhost:27022 指定ip端口连接mongo
./mongod --shutdown -f mongodb.conf 优雅关机
./mongodump -h localhost:27022 -d
dbname -o dataPath 备份数据
./mongorestore -h localhost:27022 -d
dbname dataPath --drop 恢复数据
./mongoexport -h localhost:27022 -d
dbname -c collection -f id,username,age,salary --type=csv -o dataPath 数据导出
./mongoexport -h localhost:27022 -d
dbname -c collection dataPath --upsert 数据导入
spring集成配置
xml
连接池配置
writeConcern
codecRegistry
编解码类,实现Codec接口:MongoClient.getDefaultCodecRegistry()
minConnectionsPerHost
最小连接数,connections-per-host
connectionsPerHost
最大连接数 :100
threadsAllowedToBlockForConnectionMultiplier
此参数跟connectionsPerHost的乘机为
一个线程变为可用的最大阻塞数,超过此乘机数之后的所有线程将及时
获取一个异常:5
maxWaitTime
一个线程等待
链接可用的最大等待毫秒数,0表示不等待 :1000 * 60 * 2
maxConnectionIdleTime
设置池连接的最大空闲时间,0表示没有限制 :0
maxConnectionLifeTime
设置池连接的最大使用时间,0表示没有限制 :0
connectTimeout
连接超时时间 :1000*10
alwaysUseMBeans
是否打开JMX监控 :false
heartbeatFrequency
设置心跳频率。 这是驱动程序尝试确定群集中每个服务器的当前状态的频率。 :10000
minHeartbeatFrequenc
设置最低心跳频率。 如果驱动程序必须经常重新检查服务器的可用性,那么至少要等上一次检查以避免浪费:500
heartbeatConnectTimeout
心跳检测连接超时时间:20000
heartbeatSocketTimeout
心跳检测Socket超时时间:20000
mongodb客户端驱动
compass
robo 3t
stu
dio 3t
增删改查与聚合
新增
insert
insertOne
insertMany
更新
替换更新
db.users.update({"username":"lison"},{"country":"USA"})
操作符更新
query
查询条件,类似
sql update
查询内where后面的;
update update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为
sql update
查询内set后面的
$inc 指定值自增
$set更新指定字段
$unset 将指定字段
删除
$rename 更新字段
名称
$ 定位到某
一个元素
$push
添加值到数组中,
默认放在数组最后
$addToSet
添加值到数组中,有重复则不处理
$pop
删除数组第
一个或者最后
一个
$pull从数组中
删除匹配
查询条件的值
$pullAll 从数组中
删除多个值
$each 与$push和$addToSet等一起使用来操作多个值
$slice 与$push和$each一起使用来操作用来缩小更新后数组的大小
$sort 与$push、$each和$slice一起使用来对数组进行排序
upsert 可选,这个参数的意思是,如果不存在update的记录,是否插入,true为插入,
默认是false,不插入
multi 可选,mongodb
默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新
writeConcern 可选,写策略配置。
注意
删除(不会
删除索引)
deleteOne
deleteMany
查询
常用
查询选择器
范围
$eq 等于
$lt 小于
$gt 大于
$lte 小于等于
$gte 大于等于
$in
判断元素是否在指定的集合范围里
$all 判断数组中是否包含某几个元素,无关顺序
$nin
判断元素是否不在指定的集合范围里
布尔运算
$ne 不等于,不匹配参数条件
$not 不匹配结果
$or有
一个条件成立则匹配
$
nor 所有条件都不匹配
$and 所有条件都必须匹配
$exists
判断元素是否存在
其他
. 子文档匹配
$regex 正则表达式匹配
普通
查询
映射
排序
跳过和限制
查询唯一值
示例
db.collection.find(query, projection)
db.collection.findOne(query, projection)
数组
查询
字符串数组
数组单元素
查询
数组精确查找
数组多元素
查询
索引
查询
返回数组子集
对象数组
单元素
查询
查找lison1 或者 lison12
评论过的user ($in查找符)
查找lison1 和 lison12都
评论过的user
.查找lison5评语为包含"苍老师"关键字的user($el
emmatch查找符)
聚合
查询
db.collection.aggregate()
$project:投影,指定
输出文档中的字段;
$match:用于过滤数据,只
输出符合条件的文档。$match使用MongoDB的标准
查询操作
$limit:用来限制MongoDB聚合管道返回的文档数。
$skip:在聚合管道中跳过指定
数量的文档,并返回余下的文档。
$unwind:将文档中的某
一个数组类型字段拆分成多条,每条包含数组中的
一个值。
$group:将集合中的文档分组,可用于
统计结果。
$sort:将输入文档排序后
输出。
角色安全控制
角色
分类
数据库一般角色(Database User Roles)
read
readWrite
数据库管理角色(Database Administration Roles)
dbAdmin
userAdmin
dbOwner
集群管理角色(Cluster Administration Roles)
clusterManager
clusterMonitor
hostManager
clus
teradmin
备份和恢复角色(Backup and Restoration Roles)
backup
restore
全
数据库角色(All-Database Roles)
readAnyDatabase
readWriteAnyDatabase
userAdminAnyDatabase
dbAdminAnyDatabase
超级角色(Superuser Roles)
root
mogno服务开启安全认证方式
1.服务器启动
加上auth参数,开启安全验证
2.
数据库增加安全模式后,初始化
一个“userAdminAnyDatabase“,通过客户端连接,使用admin
数据库, 执行脚本
3.使用刚创建成功的
用户登录:db.auth("boss","boss");
4.切换到lison
数据库,创建读写权限
用户
5.使用读写权限
用户lison
登录,db.auth("lison","lison"),
登录后测试;
代码安全模式连接方式
spring
java
代码
mongodb高级知识
存储引擎
MMAPV1
wiredTiger
写入数据原理
Journaling
写策略配置
写配置说明
Java
代码实现写策略
配置文件配置引擎
索引
索引管理
新增
单键唯一索引:db.users.createIndex({username :1},{unique:true});
单键唯一稀疏索引:db.users. createIndex({username :1},{unique:true,sparse:true});
复合唯一稀疏索引:db.users. createIndex({username:1,age:-1},{unique:true,sparse:true});
创建哈希索引并
后台运行:db.users. createIndex({username :'hashed'},{background:true});
删除
根据索引名字
删除某
一个指定索引:db.users.dropIndex("username_1");
删除某集合上所有索引:db.users.dropIndexs();
重建某集合上所有索引:db.users.reIndex();
查询集合上所有索引:db.users.getIndexes();
索引
分类
单键索引
复合索引
多键索引
哈希索引
查询优化
1.开启慢
查询
2.
查询监控结果
3.分析慢速
查询
explain结果
索引的注意事项
高可用
部署模型
可复制集
概念
优点
原理
oplog(操作日志)
数据同步
阻塞复制
心跳机制
选举制度
搭建
1.安装好3个以上节点的mongoDB
2.配置mongodb.conf,
增加跟复制相关的配置
3.在primary节点切换到admin库上运行可复制集的初始化命令,初始化可复制集
4.在每个节点运行rs.status()或isMaster()命令查看复制集状态.
5.测试数据复制集
效果
6.测试故障失效转移
效果
代码连接复制集
java原生驱动
Spring配置
tips
分片
概念
分片迁移
请求分流:通过路由节点将请求分发到对应的分片和块中;
数据分流:内部提供平衡器保证数据的均匀分布,数据平均分布式请求平均分布的前提
块的拆分:3.4版本块的最大容量为64M或者10w的数据,当到达这个阈值,触发块的拆分,一分为二
块的迁移:为保证数据在分片节点服务器分片节点服务器均匀分布,块会在节点之间迁移。一般相差8个分块的时候触发;
分片模型
优点
1.数据海量增长,需要更大的读写吞吐量 → 存储分布式
2.单台服务器内存、
cpu等资源是有瓶颈的 →
负载分布式
tips:分片集群是个双刃剑,在提高系统可扩展性和
性能的同时,增大了系统的复杂性,所以在实施之前请确定是必须的。
分片搭建
结构图
步骤
1.分片服务器配置:给27020、27021以及复制集(27017、27018、27019)的
配置文件增加
2.con
fig服务器配置:给复制集(27022、27023、27024)的
配置文件增加
3.配置存储数据的分片复制集
4.配置con
fig的数据集
5.
修改mongos路由节点的
配置文件。mongos的
配置文件(mongodb.conf),没有“storage”“http.RESTInterfaceEnabled”这些配置,但
增加如下配置
6.使用 ./mongos -f mongodb.conf 启动路由节点;
7.配置分片sharding
tips
分片注意点
建议
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。