mongoDB
2019-02-27 14:47:42 0 举报
AI智能生成
mongodb学习使用
作者其他创作
大纲/内容
mongodb入门
基本介绍
MongoDB:是一个数据库 ,高性能、无模式、文档性,目前nosql中最热门的数据库,开源产品,基于c++开发。是nosql数据库中功能最丰富,最像关系数据库的。
为什么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
studio 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($elemMatch查找符)
聚合查询
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
clusterAdmin
备份和恢复角色(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.config服务器配置:给复制集(27022、27023、27024)的配置文件增加
3.配置存储数据的分片复制集
4.配置config的数据集
5.修改mongos路由节点的配置文件。mongos的配置文件(mongodb.conf),没有“storage”“http.RESTInterfaceEnabled”这些配置,但增加如下配置
6.使用 ./mongos -f mongodb.conf 启动路由节点;
7.配置分片sharding
tips
分片注意点
建议
0 条评论
下一页