zoukankan      html  css  js  c++  java
  • 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

      

     

  • 相关阅读:
    十七、springboot配置FastJson为Spring Boot默认JSON解析框架
    十六、springboot整合Spring-data-jpa(二)之通用DAO接口与添加自定义方法
    十五、springboot集成定时任务(Scheduling Tasks)(二)之(线程配置)
    JavaBean的实用工具Lombok(省去get、set等方法)
    十四、springboot全局处理异常(@ControllerAdvice + @ExceptionHandler)
    项目中遇到的问题:Gradle传递性依赖冲突
    hibernate的枚举注解@Enumerated
    Sublime Text 3 注册码失效(被移除)解决方法
    SpringBoot整合dubbo
    Intellij IDEA实现SpringBoot项目多端口启动
  • 原文地址:https://www.cnblogs.com/tangh/p/6211467.html
Copyright © 2011-2022 走看看