MongoDB学习笔记

MongoDB的学习目标(v.3.4.0)

1.MongoDB的概念,非关系型数据库NOSQL

 

2.学会MongoDB的搭建

3.熟悉MongoDB使用 

  • 最基本的文档的读写更新删除
  • 各种不同类型的索引的创建与使用
  • 复杂的聚合查询
  • 对数据集合进行分片,在不同分片间维持数据均衡
  • 数据备份与恢复
  • 数据迁移

4.简单运维

  • 部署MongoDBjiqun
  • 处理多种常见的故障
    • 单节点失效,如何恢复工作
    • 数据库意外被杀死,如何进行数据恢复
    • 数据库发生拒绝服务时,如何排查原因
    • 数据库磁盘快满时,如何处理

关于数据库

什么是数据库?

存储数据的仓库,具有两个特点:1.能有组织的存储数据 2.能根据不同需求查询数据

数据库分类

根据数据库是否支持sql语言分类:

  1. sql数据库:支持sql语言的数据库 例如:oracle mysql
  2. nosql数据库:不支持sql语言的数据库 例如:redis mongodb

sql数据库和nosql数据库的优缺点?

MongoDB的优势

  • 无数据机构限制,无表的概念,即每一条记录可以有不同数据结构
  • 完全索引支持,执行单键、多键、复合、数组、全文索引
  • 方便的冗余和扩展,复制集保证数据安全,分片保证数据扩展规模
  • 良好的支持,文档支持和驱动支持

简单MongoDB服务搭建

  1. github或者mongodb官网瞎下载源码
  2. cd切换到mongodb源码目录,用scons all 命令进行编译
  3. mkdir一个mongodb_demo目录,在mongodb_deml目录下创建bin(存放二进制文件gongod...) log(存放日志文件) conf(存放配置文件) data(存放用户数据) 目录
  4. vim conf/mongod.conf,在文件里配置port=12345(mongodb服务端口号) dbpath = data (存放数据的目录) logpath = log/mongod.log(存放日子文件) fork =true
  5. 启动mongodb服务 ./bin/mongod -f ./conf/mongod.conf (第一次启动会有警告,只需要在启动命令前加numactl --interleave=all取消告警)
  6. 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类型的记录

索引

  1. 索引的种类与使用
  2. 索引的匹配规则
  3. 如何建立合适的suoyin
  4. 索引建立的情况评

索引的种类

  • _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

索引构建情况分析

  • 索引好处:加快索引相关的查询
  • 索引不好处:增加磁盘空间消耗,降低写入性能

如何评判当前索引构建情况

  1. mongostat工具介绍
  2. profile集合介绍
  3. 日志介绍
  4. 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安全概念

  1. 最安全的是物理隔离
  2. 网络隔离其次
  3. 防火墙再其次
  4. 用户名密码在最后

创建用户名密码

  1. auth开启权限认证,在conf/mongod.conf里配置auth=true
  2. 创建语法:db.createUser({user:"test",pwd:"test",customDate:"this is test",roles:[role:"read",db:"admin"]})
  3. 角色类型:内建类型(read,readWrite,dbAdmin,dbOwner userAdmin)

mongoDB用户角色详解

  • 数据库角色:read readWrite dbAdmin dbOwner userAdmin
  • 集群角色:clusterAdmin clusterManager
  • 备份角色:backup restore
  • 其他特殊权限:DBAdminAnyDatabase

 

  

 

posted @ 2016-12-22 15:27  天道酬勤情  阅读(188)  评论(0编辑  收藏  举报