MongoDB学习笔记
MongoDB的学习目标(v.3.4.0)
1.MongoDB的概念,非关系型数据库NOSQL
2.学会MongoDB的搭建
3.熟悉MongoDB使用
- 最基本的文档的读写更新删除
- 各种不同类型的索引的创建与使用
- 复杂的聚合查询
- 对数据集合进行分片,在不同分片间维持数据均衡
- 数据备份与恢复
- 数据迁移
4.简单运维
- 部署MongoDBjiqun
- 处理多种常见的故障
- 单节点失效,如何恢复工作
- 数据库意外被杀死,如何进行数据恢复
- 数据库发生拒绝服务时,如何排查原因
- 数据库磁盘快满时,如何处理
关于数据库
什么是数据库?
存储数据的仓库,具有两个特点:1.能有组织的存储数据 2.能根据不同需求查询数据
数据库分类
根据数据库是否支持sql语言分类:
- sql数据库:支持sql语言的数据库 例如:oracle mysql
- nosql数据库:不支持sql语言的数据库 例如:redis mongodb
sql数据库和nosql数据库的优缺点?
MongoDB的优势
- 无数据机构限制,无表的概念,即每一条记录可以有不同数据结构
- 完全索引支持,执行单键、多键、复合、数组、全文索引
- 方便的冗余和扩展,复制集保证数据安全,分片保证数据扩展规模
- 良好的支持,文档支持和驱动支持
简单MongoDB服务搭建
- github或者mongodb官网瞎下载源码
- cd切换到mongodb源码目录,用scons all 命令进行编译
- mkdir一个mongodb_demo目录,在mongodb_deml目录下创建bin(存放二进制文件gongod...) log(存放日志文件) conf(存放配置文件) data(存放用户数据) 目录
- vim conf/mongod.conf,在文件里配置port=12345(mongodb服务端口号) dbpath = data (存放数据的目录) logpath = log/mongod.log(存放日子文件) fork =true
- 启动mongodb服务 ./bin/mongod -f ./conf/mongod.conf (第一次启动会有警告,只需要在启动命令前加numactl --interleave=all取消告警)
- mongo客服端 是mongodb自带的客服段,只需要把编译后的mongodb中的mongo复制到mongodb_demo/bin下,链接mongodb服务,bin/mongo 127.0.0.1:12345/test
mongodb基本操作命令
对数据库的操作命令
- show dbs 查看数据库
- use 数据库名 切换数据库(如果数据库不存在就创建)
- show tables 查看集合
- db.dropDatabase() 删除数据库
对集合的操作命令(增删查改)
- db.collectionName.insert({name:"demoName"}) 插入数据(如果集合不存在,就先创建集合,再插入数据)
- db.collectionName.find() 查询所有记录
- db.collectionName.find({name:"demoName"}) 查询name=demoName的所有记录
- db.collectionName.find().count() 查询有多少条记录
- db.collectionName.find().skip(3).limit(2).sort({name:1}) 查询出所有记录,skip(2)跳过前两条记录,limit(2)分页只显示2条记录,sort({name:1})根据name字段升序排序 1表示升序 -1表示降序
- db.collectionName.update({name:"A"},{name:"B"}) name=A更新为B,如果该条记录还有其他字段,都会被覆盖,如果匹配到多条name=A的记录,只有修改第一条
- db.collectionName.update({name:"A"},{$set:{name:"B"}}) name=A更新为B,如果改条记录还有其他字段,不会被覆盖,如果匹配到多条name=A的记录,只有修改第一条
- db.collectionName.update({name:"A"},{name:"B"},true) name=A更新位B,如果不存在name=A的记录,就会先创建name=A记录再做更新
- db.collectionName.update({name:"A"},{$set:{name:"B"}},false,true),更新多条name=A的记录为name=B
- db.collectionName.remove({name:“A”})删除字段name=A的记录,如果匹配到多条,都会删除
- db.collectionName.drop()删除整个集合
条件操作符
- (>)大于 $gt
- (<)小于 $lt
- (>=)大于等于 $gte
- (<=)小于等于 $lte
- 例如:db.collectionName.find({age:{$gt:10}}) 查询age大于10的记录
$type操作符
mongodb支持数据类型:
- String:字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。
- Integer:整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位。
- Boolean:布尔值。用于存储布尔值(真/假)。
- Double:双精度浮点值。用于存储浮点值。
- Min/Max keys:将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比。
- Arrays:用于将数组或列表或多个值存储为一个键。
- Timestamp:时间戳。记录文档修改或添加的具体时间。
- Object:用于内嵌文档。
- Null:用于创建空值。
- Symbol:符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言。
- Date:日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息。
- Object ID:对象 ID。用于创建文档的 ID。
- Binary Data:二进制数据。用于存储二进制数据。
- Code:代码类型。用于在文档中存储 JavaScript 代码。
- Regular expression:正则表达式类型。用于存储正则表达式。
mongodb支持数据类型对应数字:
例如:db.collectionName.find({name:{$type:2}}) 查询name字段数据类型为string类型的记录
索引
- 索引的种类与使用
- 索引的匹配规则
- 如何建立合适的suoyin
- 索引建立的情况评
索引的种类
- _id索引
- 单键索引
- 多建索引
- 复合索引
- 过期索引
- 全文索引
- 地理位置索引
_id索引
- _id索引是绝大多数集合默认建立的索引 对于每一个插入的数据,mongodb都会自动生成一条唯一的_id字段
- db.collectionName.getIndexes()查看索引信息
单键索引
- 单键索引,最普通的索引,不会自动创建
- db.collectionName.ensureIndex({name:1}) 以字段name创建单键索引,1表示升序 -1为降序
多键索引
- 多键索引与单键索引创建形式相同,字段值不一样。单键索引,值为一个单一的值,如字符串 数字 日期;多键索引,值具有多个记录,如数组
复合索引
- 当我们的查询条件不只有一个时,就需要建立复合索引
- db.conllectionName.ensureIndex({name:1,age:1}
过期索引
- 过期索引,在一段时间后会过期的索引,在索引过期后,相应的数据会被删除,这适合存储一些在一段时间之后会失效的数据,例如:用户的登录信息,存储的日志
- db.collectionName.ensureIdex({time:1},{expireAfterSeconds:10}) expireAfterSeconds的值单位位秒 为time字段建立了过期索引,10秒有time字段的记录就会被自动删除
- 过期索引的限制
- 存储过期索引字段的值必须是指定的时间类型。必须是ISODate或ISODate数组,不能使用时间戳
- 如果指定了Date数组,则按照最小的时间进行删除
- 过期索引不能是复合索引
- 删除时间不是精确的,删除过程是有后台程序每60s执行一次,而且删除也需要一些时间
全文索引
- 全文索引,对字符串或字符串数组创建全文搜索的索引。全文索引创建时,value是固定“text”
- db.collectionName.ensureIndex({key:"text"}) 为一个字段创建全文索引
- db.collectionName.ensureIndex({{key1:"text",key2:"text"}) 为连个字段创建全文索引
- db.collectionName.ensureIndex({"$**":"text"}) 为整个集合创建全文索引
- 全文查询
- db.collectionName.find({$text:{$search:"xx"}})
- xx表示 aa bb cc,他们之间空格隔开的表示或,查询包含aa或者bb或者cc的记录
- xx表示aa bb -cc,查询不包含cc的记录
- \"aa\" \"bb\" \"cc\",\"转义“,表示查询同时包括aa bb cc的记录
- 全文索引相似度,$meta操作符{score:{$meta:"textScore"}},写在查询条件后面可以返回结果的相似度,再使用sort函数一起使用,就可以模拟一个简单版的百度搜索了。
- 例如:db.collectionName.find({$text:{$search:"xx"}},{score:{$meta:"textScore"}}).sort({score:{$meta:"textScore"}})
- 全文索引使用限制
- 每次查询,只能指定一个$text查询
- $text查询不能出现在$nor查询中
- 查询中如果包含了$text,hint不再起作用
- mongo全文索引,暂时不支持中文
索引属性
- name:给索引取一个名称
- 例如:db.collectionName.ensureIndex({xx:1},{name:"单键索引"})
- unique:唯一性
- 例如:db.collectionName.ensureIndex({xx:1},{unique:true})
- sparse:稀疏性 为没有某字段的记录就不创建索引
- 例如:db.collectionName.ensureIndex({xx:1},{sparse:true})
- expireAfterSeconds:过期性
- 例如:db.collectionName.ensureIndex({xx:1},{expireAfterSeconds:10})
地理位置索引
- 概念:将一些点的位置存储在mongodb中,创建索引后,可以按照位置来查找其他点
- 子分类:
- 2d索引,用来存储和查找平面上的点
- 2dsphere索引,用来存储和查找球面上的点
- 查找方式:
- 查找距离某一个点距离内的点
- 查找包含在某区域内的点
2d索引:平面地理位置索引
- 创建方式:db.collectionName.ensureIndex({w:"2d"}) value:固定为2d
- 位置表示方式:经纬度【经度,维度】
- 取值范围:经度【-180,180】纬度【-90.90】
- 查询方式:
- $near查询:查询距离某个点最近的点,$maxDistance限制距离 例如:db.collectionName.find({w:{$near:[1,1],$maxDistance:10}})查询距离【1,1】点内的点,限制距离W $geoWithin查询:查询某个形状内的点
- 形状的表示 $box:矩形 {$box:[[1,1],[2,2]]}表示 $center:圆形{$center:[[x,x],r]}表示 $polygon:多边形{$polygon:[[2,3],[4,5],[7,8]]}
- 例如:db.collectionName.find({w:{$geoWithin:{$box:[[x,x],[x,x]]}}})
- geoNear查询
- db.runCommand({geoNear:<collectionName>,near:[x,y],minDistance:x,maxDistance:x,num:x})
2dsphere索引
- 概念:球面地理位置索引
- 创建方式:db.collectionName.ensureIndex({w:"2dsphere"})
- 位置表示形式:
- GeoJson:描述一个点,一条直线,多边形等形状
- 格式:{type:"",conrdinates:[<conrdinates>]}
- 查询方式与2d索引查询方式一样,并且支持$minDistance和$maxDistance
索引构建情况分析
- 索引好处:加快索引相关的查询
- 索引不好处:增加磁盘空间消耗,降低写入性能
如何评判当前索引构建情况
- mongostat工具介绍
- profile集合介绍
- 日志介绍
- explain分析
mongostat工具
- mongostat:查看mongodb运行状态的程序
- 使用说明:mongostat -h 127.0.0.1:12345
- 字段说明:
- 索引情况:idx miss
- 读写队列:qr | qw
profile集合
- 把profile运行级别设置为2,就能记录我们每次操作的情况,因为profile集合如果记录量比较大,就比较吃资源,所以一般用在一个产品上线做测试时。
- db.getProfilingStatus()查看profile运行状态
- db.getProfilingLevel()查看profile运行级别
- db.setProfilingLevel(n)设置profile运行级别
mongodb日志
- conf/mongod.log 配置文件中,verbose = vvvvv "v"越多信息越详细
explain分析
- 在查询后跟explain().就鞥查看详细的信息了
MongoDB安全
mongodb安全概念
- 最安全的是物理隔离
- 网络隔离其次
- 防火墙再其次
- 用户名密码在最后
创建用户名密码
- auth开启权限认证,在conf/mongod.conf里配置auth=true
- 创建语法:db.createUser({user:"test",pwd:"test",customDate:"this is test",roles:[role:"read",db:"admin"]})
- 角色类型:内建类型(read,readWrite,dbAdmin,dbOwner userAdmin)
mongoDB用户角色详解
- 数据库角色:read readWrite dbAdmin dbOwner userAdmin
- 集群角色:clusterAdmin clusterManager
- 备份角色:backup restore
- 其他特殊权限:DBAdminAnyDatabase