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