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 ...
随机推荐
- java网络编程精解demo1---读取用户控制台的输入的数据并显示
package test3; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream ...
- 自定义webkit浏览器滚动条样式
::-webkit-scrollbar { width: 5px; height: 5px; } ::-webkit-scrollbar-track { background-color: trans ...
- webView和js交互
与 js 交互 OC 调用 JS // 执行 js - (void)webViewDidFinishLoad:(UIWebView *)webView { NSString *title = [web ...
- JQuery------分页插件下载地址
转载GitHub: https://github.com/pgkk/kkpager
- 二、基于hadoop的nginx访问日志分析---计算日pv
代码: # pv_day.py#!/usr/bin/env python # coding=utf-8 from mrjob.job import MRJob from nginx_accesslog ...
- coreseek常见错误原因及解决方法
coreseek常见错误原因及解决方法 Coreseek 中文全文检索引擎 Coreseek 是一款中文全文检索/搜索软件,以GPLv2许可协议开源发布,基于Sphinx研发并独立发布,专攻中文搜索和 ...
- jQuery选择器总结
jQuery 的选择器可谓之强大无比,这里简单地总结一下常用的元素查找方法 $("#myELement") 选择id值等于myElement的元素,id值不能重复在文档中 ...
- Kinect之彩色图像数据
彩色图像很有用,很有用!!说到图像识别,未来肯定是个大方向!在机器人视觉和一些智能识别在应用很广,而获取下来的数据再加上Opencv就能做出很多很好玩很有趣的功能.这个以后等我进一步成长后再回来慢慢记 ...
- Xcode 8 支持 iOS 7 真机解决过程记录
领导要求不放弃iOS 7 用户,所以我们Xcode 8 上面支持ios 7 必须要解决! 解决方法(过程): 1.应用程序--Xcode(原来的Xcode 7)-- 显示包内容--Contents-- ...
- 防火墙iptables
iptables命令可用于配置Linux的包过滤规则,常用于实现防火墙.NAT.咋一看iptables的配置很复杂,掌握规律后,其实用iptables完成指定任务并不难,下面我们通过具体实例,学习ip ...