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
 - 形状的表示 $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})
 
$geoWithin查询:查询某个形状内的点
 
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
 
MongoDB学习笔记的更多相关文章
- MongoDB学习笔记系列
		
回到占占推荐博客索引 该来的总会来的,Ef,Redis,MVC甚至Sqlserver都有了自己的系列,MongoDB没有理由不去整理一下,这个系列都是平时在项目开发时总结出来的,希望可以为各位一些帮助 ...
 - PHP操作MongoDB学习笔记
		
<?php/*** PHP操作MongoDB学习笔记*///*************************//** 连接MongoDB数据库 **////*************** ...
 - MongoDB 学习笔记(原创)
		
MongoDB 学习笔记 mongodb 数据库 nosql 一.数据库的基本概念及操作 SQL术语/概念 MongoDB术语/概念 解释/说明 database database 数据库 table ...
 - mongoDB 学习笔记纯干货(mongoose、增删改查、聚合、索引、连接、备份与恢复、监控等等)
		
最后更新时间:2017-07-13 11:10:49 原始文章链接:http://www.lovebxm.com/2017/07/13/mongodb_primer/ MongoDB - 简介 官网: ...
 - MongoDB学习笔记(转)
		
MongoDB学习笔记(一) MongoDB介绍及安装MongoDB学习笔记(二) 通过samus驱动实现基本数据操作MongoDB学习笔记(三) 在MVC模式下通过Jqgrid表格操作MongoDB ...
 - 【转】MongoDB学习笔记(查询)
		
原文地址 MongoDB学习笔记(查询) 基本查询: 构造查询数据. > db.test.findOne() { "_id" : ObjectId("4fd58ec ...
 - MongoDB学习笔记(六)--复制集+sharding分片 && 总结
		
复制集+sharding分片 背景 主机 IP 服务及端口 Server A ...
 - MongoDB学习笔记(五)--复制集 && sharding分片
		
主从复制 主从节点开启 主节 ...
 - MongoDB学习笔记(四)--索引 && 性能优化
		
索引 基础索引 ...
 - MongoDB学习笔记(三)--权限 && 导出导入备份恢复 && fsync和锁
		
权限 绑定内网I ...
 
随机推荐
- Bzoj1305 [CQOI2009]dance跳舞
			
Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 2925 Solved: 1221 Description 一次舞会有n个男孩和n个女孩.每首曲子开始时 ...
 - bzoj2702[SDOI2012]走迷宫
			
题意:给你一个有向图,点数10000,边数1000000,SCC大小不超过100(按数据范围的写法只有第三部分数据满足这个条件,不过第二部分数据并没有出现大小大于100个点的SCC,我是用数组大小为1 ...
 - 《Javascript高级程序设计》读书笔记(1-3章)
			
第一章 JavaScript简介 1.1 JavaScript简史 略 1.2 JavaScript实现 虽然 JavaScript 和 ECMAScript 通常都被人们用来表达相同的含义,但 Ja ...
 - Bitmap转换成BitmapImage
			
public BitmapImage BitmapToBitmapImage(System.Drawing.Bitmap bitmap) { MemoryStream ms = new MemoryS ...
 - selenium 页面截图并保存
			
import java.io.File; import java.io.IOException; import org.apache.commons.io.FileUtils; import org. ...
 - webapi5
 - 轮播插件unsilder 源码解析(一)---使用
			
啰嗦几句:学习的可以直接省略,一直本着写原生的插件想法,但是前天看了吕大豹的博客觉得自己都没有正经的写个jquery插件:所以在开始写之前我会先对几个比较热门的jquery的插件进行源码分析:至于为什 ...
 - mysql 主从单库单表同步 binlog-do-db replicate-do-db
			
方案一:两边做主从. SELECT SUM(DATA_LENGTH)+SUM(INDEX_LENGTH) FROM information_schema.tables WHERE TABLE_SCHE ...
 - Java 泛型 <? super T> 中 super 怎么 理解?与 extends 有何不同?
			
看知乎:https://www.zhihu.com/question/20400700 了解的越多,就会发现,越多不了解.
 - 利用exp/imp备份恢复数据库实例
			
用exp/imp备份数据库: Oracle数据导入导出imp/exp功能:Oracle数据导入导出imp/exp就相当与oracle数据还原与备份. 大多情况都可以用Oracle数据导入导出完成数据的 ...
 
			
		