------------------------------------------------mongodb简述---------------------------------------------------------

----------------------------------------------mongodb编译----------------------------------------------------------

本次课程运行环境介绍

cd mongo-r2.6.5    //进入目录

scons all    //编译 , 如果编译失败,自行安装相关扩展如果多次失败,可以直接下载编译好的二进制文件

编译完成,看一下编译后的文件  ls

mongod  数据库执行程序

mongo  连接数据库的客户端

mongoimport   mongoexport       mongodb的导入导出

mongodump   mongorestore       导入导出的二进制数据,不能被直接读取,一般做数据备份和恢复

mongooplog   操作日志回访,复制集会用到

mongostat    查看mongo服务器的各种状态,监控部分会用到

其他的可以查看官方文档

----------------------------------------------------------搭建mongodb服务器-------------------------------------------

mkdir mongodb_simple

cd mongodb_simple

mkdir  data

mkdir  log

mkdir conf

mkdir bin

cp ../mongo-r2.6.5/mongod bin/      //先将准备好的mongod 程序拷贝到bin目录下

cd conf/

vim mongod.conf        在这个文件中我们将输入mongodb启动的配置参数

port    //mongodb启动时要监听的端口

dbpath   //mongod数据存储的目录,可以使用相对或者绝对路径

logpath   //需要指明一个实际的文件

fork = true  //在linux下启动后台进程,win下无效

wq 保存

cd ..   进入上层目录

./bin/mongod -f conf/mongod.conf   //指定初始化所使用的配置文件

显示以下信息说明被成功初始化

cd data   //查看目录下生成的文件

ls

cd ../log

ls

tail mongod.log   //查看日志,mongod已经在正常打印日志

mongo服务就搭建好了

看一下视频中完整的截图

----------------------------------------------用客户端进行连接--------------------------------------------------------------------

cd mongodb_simp/          //进入安装好的mongo文件

cp  ../mongo-r2.6.5/mongo bin/         //为方便操作将编译文件中的  mongo  拷贝到 bin 目录下

./bin/mongo --help       //查看mongo 的使用说明

版本号, 连接mongo的几种方式。

用户名密码,因为我们没有用户名密码暂时先不输入

./bin/mongo 127.0.0.1:12345/test

db.shutdownServer()    //关闭mongod服务,需要admin权限

-----------------------------------

numactl 服务报出的错误

此处的错误提示意思是,要禁用 numactl 否则将影响性能

db.shutdownServer()     //关闭mongo服务  需要使用admin权限,参照下图

(kill命令也可以关闭服务。kill -15。最好不要用kill -9)

numactl --interleave=all bin/mongod -f conf/mongod.conf       //重新启动mongod服务

./bin/mongo 127.0.0.1:12345/test     //再次连接没有报出警告

---------------------------------------------

---------------------------------------------mongo基本数据库操作-------------------------------------------------------------------

./bin/mongo 127.0.0.1:12345      //连接mongod服务

show dbs       //显示mongod 中的数据库

use imooc     //使用数据库

show collections   //查看当前数据库的集合

db.dropDatabase()   //删除当前的数据库

创建数据库, 需要的时候会自己创建。

写入,用的是json格式 db.集合名.动作({json数据})

db.imooc_collection.insert({x:1})   //向imooc_collection插入x:1的文档

db.imooc_collection.find()   //默认为空,默认返回所有数据

_id 是mongo生成的字段,不可以重复

db.imooc_collection.insert({_id:1,x:2})  //插入_id为1的数据

error :   db.imooc_collection.insert({_id:1,x:3}) //_id重复会报错

db.imooc_collection.find({x:1})   //查询x为1 的数据

for(i=3;i<100;i++)db.imooc_collection.insert({x:1})   //将插入97条数据

db.imooc_collection.count()   //查询有多少条数据

db.imooc_collection.find().skip().limit().sort({x:1})   //skip 跳过多少条数据,limit 返回多少条数据, sort 根据“x” 的正序排序 1代表的是正序

db.imooc_collection.update({x:1},{x:999})   //将x为1 的数据 更新城 x为999

db.imooc_collection.update({x:1},$set{x:999})     //如果要更新部分字段,其他字段保持不变。$set 只更新存在的部分,其他字段不变

db.imooc_collection.update({y:100},{y:999})      //更新一条不存在的数据,y:100  并不存在,修改完后find()查询y:999并不存在

db.imooc_collection.update({y:100},{y:999},true)  //更新一条不存在的数据,如果不存在则创建使用true ,  find()查询y:999存在

假设现在有3条{c:1}的数据

db.imooc_collection.update({c;1},{c:2})    //只会更新第一条数据,这么设计是为了放着误操作

db.imooc_collection.update({c:1},{$set{c:2}},false,true)    //更新所有{c:1}的数据

db.imooc_collection.remove()   //不传递参数,会报错。 remove必须有参数

db.imooc_collection.remove({c:1})    //默认删除所有数据

db.imooc_collection.drop()     //删除文档

db.imooc_collection.find({x{$exists:true}})    //查找只存在x字段的记录

索引

数据量较小时,不使用索引查询是很快的。数据量较大时,不使用索引查询会变得非常缓慢,几千万,几亿条数据,不适用索引,将无法返回相应的结果。

如果文档索引数目较多,创建索引需要消耗一定时间。如果负载较重,不能直接创建索引,需要在使用之前就创建索引。

性能会大幅度提高,常用的查询需要创建索引,影响写入和更新。

对已存在的索引再次进行创建,直接返回成功。

索引的分类

db.imooc_collection.getIndexes()     //查询集合的索引情况

db.imooc_collection.ensureIndex({x:1})     // 给  x 建立索引, 1 为正向排序,-1 为逆向排序。

多键索引这个概念不太好理解,仔细阅读下面内容。

创建形式是一样的,都是       db.imooc_collection.ensureIndex({x:1})   创建索引

但是如果是数组,就是多键索引

db.imooc_collection.ensureIndex({x:1})          //创建索引

db.imooc_collection.insert({x:[1,2,3,4,5]})       //这里就是多键索引 , 他们只有值类型不相同

当索引的字段是数组时候,才会"自动的给数组内字段的每一个元素"设置索引,这才是多key索引,自动指的是给数组内部的元素自动设置;

db.imooc_collection.ensureIndex({x:1,y:1})     //创建复合索引,x是字段名,1代表的是顺序,-1代表的是倒序

db.imooc_collection.find({x:1,y:2})   //就可以使用索引了

db.imooc_collection.ensureIndex({time:1},{expireAfterSconds:10})   // 设置10秒后过期,过期后数据自动删除

db.imooc_collection.insert({time:new Date()})    //将当前时间插入到数据库

db.articles.ensureIndex({key:"text"})    //在key这个字段上,创建“text” 全文索引

db.articles.ensureIndex({key_1:"text",key_2:"text"})    //创建多个 全文索引

db.articles.ensureIndex({"$**":"text"})    // $**  对集合中所有字段创建一个大的全文索引,创建“text” 全文索引

db.articles.find({$text:{$search:"coffee"}})          //最简单的使用全文索引

db.articles.find({$text:{$search:"aa bb cc"}})       //包含aa   或者 bb  或者 cc 的全文索引

db.articles.find({$text:{$search:"aa bb -cc"}})      // -cc 表示不包含cc的字符串

db.articles.find({$text:{$search:"\"aa\" \"bb\" \"cc\""}})     //加上双引号,表示 即包含 aa 又包含  bb  又包含cc 的字符串,双引号需要转义

有时候百度查询,与你查询越相关的越排在前面。 mongo不仅能告诉你相似的查询文档,还能告诉你有多相似

全文索引相似度

score是相似度,后面是相似度的值

根据相似度排序,用sort来实现

------------------------------------------------索引的属性-------------------------------------------------------------------

名字,name指定

db.imooc_2.ensureIndex({x:1})       //创建一个单键索引

db.imooc_2.getIndexes()       //获取索引的名字

名字的格式是  "键" + "_" + "排序方式"

复合索引  ("键" + "_" + "排序方式") + ("_") + ("键" + "_" + "排序方式")例:x_1_y_1

名字的长度最大是125字节

为了避免超限,可以自定义索引名字

db.imooc_2.ensureIndex({x:1,y:1,z:1,m:1},{name:"normal_index"})

删除索引的时候也可以直接使用索引的名字

db.imooc_2.dropIndex("normal_index")

倒序

复合索引

索引自定义命名

删除索引

 唯一性,unique指定

db.imooc_2.ensureIndex({m:1,n:1},{unique:true})      //这个索引是唯一索引,不可以在同一个集合插入两条具有同一唯一索引的字段。

 稀疏性,sparse指定

什么是稀疏:mongodb在处理索引中存在在,文档中不存在的两种方法。

例如: x字段创建了索引,但是插入了一条数据中并没有x字段,默认mongodb会为这个不存在的字段创建索引

如果你不想这件事情发生,就设置sparse:true来避免。

不必为不存在的数据创建索引,如果文档中这个字段很多都没有值,可以减少磁盘占用,会加快插入速度。

sparse:true是稀疏     false 不是稀疏 。  默认是不稀疏的,自行创建的索引都是不稀疏的

过期索引:会在一段时间后删除(参照上文的过期索引讲解)

-----------------------------------------地理位置索引-----------------------------------------------------------------------

区别:计算距离时。是计算平面距离,还是计算球面距离

创建方式,查询方式,支持的参数都有些不同

例如:打车软件查找附近的出租车, 或者查找附近的餐馆,都可以用距离某个点来查找

或者包含在哪个区域内的所有店铺

2D索引的创建方式

db.collection.ensureIndex({w:"2d"})       //创建2d索引

创建2d索引,字段的值一旦超过取值范围是不会报错的,但是会引起其他的错误,避免这样做

db.location.find({w:{$near:[1,1]}})       //$near  默认会返回100条距离最近的数据

db.location.find({w:{$near:[1,1]},$maxDistence:10})      //限制最远的距离      (通常会想到 $minDistence,但是这里并不起作用)

goWithin                       //查询形状内的点

db.location.find(w:{$goWithin:{$box[[0,0],[3,3]]}})         //goWithin 查询形状内的某个点。 $box 矩形[坐标] 。查询矩形中0,0 到3,3 的点

db.location.find(w:{$goWithin:{$center[[0,0],5]}})          //$center查找圆形中的某个点,0.0 是圆心的位置,5 是半径

db.location.find(w:{$goWithin:{$polygon[[0,0],[0,1],[2,5],[6,1]]}})  //查找多边形中的某个点

插入示例

geoNear返回了更多的数据,比如一些团购网

使用方式可以去查看文档

因为他支持多边形保存方式,查询某个性状中的点,或者某个多边形内交叉的点

---------------------------------------------------------索引构建评判分析---------------------------------------------------

mongostat  --help

第一部分是参数

第二部分是返回值说明 Fields

mongostat 输出部分字段的含义:
inserts/query/update/delete: 分别指当前mongodb插入、查询、更新、删除 数量,以每秒计;
getmore: MongoDB返回结果时,每次只会返回一定量;当我们继续用find()查询更多数据时,系统就会自动用getmore来获取之后的数据;
command: 执行的命令数量;
flushes: MongoDB使用虚拟内存映射的方式管理数据,我们在向MongoDB写入或查询数据时,MongoDB会做一次虚拟内存映射,有些数据其实是在硬盘上的;每隔一段时间,MongoDB会把我们写到内存的数据flush到硬盘上;这个数据大的话,会导致mongodb的性能较差;
mapped/vsize/res: 与磁盘空间大小有关,申请的内存大小;
faults:如果我们查询的数据,没有提前被MongoDB加载到内存中,我们就必须到硬盘上读取,叫做“换页”;如果faults比较高,也会造成性能下降;
idx miss: 表示我们的查询没有命中索引的比率;如果很高,说明索引构建有问题,索引不合适或者索引数量不够;
qr|qw: 说明MongoDB的写队列或者读队列的情况。我们向MongoDB读写时,这些请求会被放到队列中等待。数量大(几百上千)说明MongoDB处理速度慢或者读写请求太多,性能会下降。
ar|aw: 当前活跃的读写客户端的个数。
示例:

性能分析工具mongostat -h ip地址:端口
查询结果中需要注意的表列值
qr/qw 表示读队列和写队列值,较高时数据库存在性能问题
idx miss 表示查询时索引命中情况,较高时影响查询效率

 profile集合

查看当前数据库的profile状态
db.getProfilingStatus()
{ "was" : 0, "slowms" : 100 }
查看当前数据库的记录级别
db.getProfilingLevel()
0|1|2
设置当前数据库的profile记录级别
db.setProfilingLevel(0|1|2)
was --profile记录级别,0关闭,1记录所有超过slowms的慢查询,2记录所有操作
slowms --慢查询阀值
查看profile文件
如果profile数据量非差大,会影响数据库性能,一般是在上线前,或者刚上线的时候使用。
上线环境不建议运行
show tables //会多出两个集合

db.system.profile.find()

{ "op" : "query",--操作类型
"ns" : "imooc.system.profile", --集合的名字 // --查询的命名空间,;databasename.collectionname'
"query" : { "query" : { }, --查询条件
"orderby" : { "$natural" : -1 } }, --约束条件
"ntoreturn" : 1, --返回数据数目
"ntoskip" : 0, --跳过数条目
"nscanned" : 1, --扫描的数目 索引+实体
"nscannedObjects" : 1, --扫描的 实体 数据数目。如果扫描索引就能得到数据就不会扫描实体
"keyUpdates" : 0, --
"numYield" : 0, --其他情况
"lockStats" : { --锁状态
"timeLockedMicros" : { --锁占用时间(微秒)
"r" : NumberLong(82), --读锁
"w" : NumberLong(0) --写锁
},
"timeAcquiringMicros" : {
"r" : NumberLong(2), "w" : NumberLong(2)
}
},
"nreturned" : 1,
"responseLength" : 651, --返回长度
"millis" : 0, --查询时间 mongo日志设置,配置文件berbose参数,"v" 越多,详细度越高1-5个 "v"

vim conf/mongod.conf
verbose = vvvvv 日志记录级别

explain分析
会查询此次查询的详细信息

db.colltction.find({x:1}).explain()

{
"cursor" : "BasicCursor", --使用的索引
"isMultiKey" : false,
"n" : 1,
"nscannedObjects" : 100000, --扫描的数据量
"nscanned" : 100000, --包含索引的扫描量
"nscannedObjectsAllPlans" : 100000,
"nscannedAllPlans" : 100000,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 781,
"nChunkSkips" : 0,
"millis" : 25, --查询消耗时间(毫秒)
"server" : "XXX",
"filterSet" : false
}
cursor 如果使用索引会在后面显示  "BasicCursor" 就是没有使用索引  "BasicCursor x_1" 使用了x字段正序索引
millis 消耗时间越高,性能越差。
nscanned 扫描 索引+实体的 条数。 扫描的越高,性能越差

------------------------------------------------------------mongodb 安全------------------------------------------------------

物理隔离

物理隔离: 最安全的是物理隔离,任何手段都不能链接到我们的主机,这样是不现实的

网络隔离:开发及测试及都在自己的内网中,是比较安全的。

防火墙隔离: 配置只允许某些IP链接我的主机

用户名密码:安全机制比较弱,如果密码设计的不负责,可能会被别人尝试出来。我们还是大多是用用户名密码

默认mongodb并没有开启权限认证

开启认证的两种方法

vim conf/mongo.conf

auth = true  //开启权限认证

ps -ef|grep mongod|grep 12345

kill 9528

./bin/mongod      //重启mongod服务

创建用户

mame : 用户名

pwd:密码

customData :说明,对中文支持不太好

roles:[{role:角色类型,db:作用在哪个数据库上}]

角色类型可以设置为

read: 对指定的db,读取操作,

readWrite:读写操作,不可操作索引,不能删除数据库等;

dbAdmin:可对数据库类型进行操作,

dbOwner:具有前三个的权限;

userAdmin:可以管理其他用户权限

db.createUser({user:"imooc",pwd:"imooc",roles:[{role:"userAdmin",db:"admin"},{role:"read",db:"test"}]})

无密码还是可以登陆mongod 的。但是不能进行任何操作

./bin/mongo 127.0.0.1:12345 -u imooc -p imooc

    1. 数据库用户角色:read、readWrite;
2. 数据库管理角色:dbAdmin、dbOwner、userAdmin;
3. 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
4. 备份恢复角色:backup、restore;
5. 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
    6. 超级用户角色:root
// 这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase)
7. 内部角色:__system

createRole 来创建权限

_id: 唯一的id

role: 用户的权限名字

db:数据库的名字

privileges :在这个数据库中的权限操作

图中的第一个resource 解释

数据库myApp上, 任意集合 ,具有find...

logs 具有 insert 权限


mongodb 慕课网的更多相关文章

  1. 慕课网视频破解付费分享-前端开发-Python等

    微信小程序 慕课网   BAT大牛经验总结全面深入解读Android面试   前端JS基础面试技巧   vue2.0+node.js+mongodb全栈打造商城   Vue.js高级实战-开发移动端音 ...

  2. Python爬虫入门教程 20-100 慕课网免费课程抓取

    写在前面 美好的一天又开始了,今天咱继续爬取IT在线教育类网站,慕课网,这个平台的数据量并不是很多,所以爬取起来还是比较简单的 准备爬取 打开我们要爬取的页面,寻找分页点和查看是否是异步加载的数据. ...

  3. 慕课网-Java入门第一季-7-2 Java 中无参无返回值方法的使用

    来源:http://www.imooc.com/code/1578 如果方法不包含参数,且没有返回值,我们称为无参无返回值的方法. 方法的使用分两步: 第一步,定义方法 例如:下面代码定义了一个方法名 ...

  4. 使用js脚本批量下载慕课网视频

    慕课网(http://www.imooc.com/)上有很多不错的视频,当然我不是来给慕课网打广告的,我本人学习过很多慕课网上的免费的视频. 在线看如果网速慢时,可能会有卡顿,没网时无法观看.所有说下 ...

  5. 手机端web学习基础--from慕课网

    web知识零零散散的知道一些,但总感觉不够系统,遇到问题不知道如何解决,因此特此来系统的学习一下web前端的知识.从慕课网的web基础看起.下面学习http://www.imooc.com/learn ...

  6. 安卓开发_慕课网_Fragment实现Tab(App主界面)

    学习内容来自“慕课网” 这里用Fragment来实现APP主界面 思路: 底部横向排列4个LinearLayout,每个LinearLayout包含一个图片按钮和一个文字 1.默认显示第一个功能(微信 ...

  7. 安卓开发_慕课网_ViewPager与FragmentPagerAdapter实现Tab实现Tab(App主界面)

    学习内容来自“慕课网” ViewPager与FragmentPagerAdapter实现Tab 将这两种实现Tab的方法结合起来.效果就是可以拖动内容区域来改变相应的功能图标亮暗 思路: Fragme ...

  8. 安卓开发_慕课网_ViewPager实现Tab(App主界面)

    学习内容来自“慕课网” 网站上一共有4种方法来实现APP主界面的TAB方法 这里学习第一种 ViewPager实现Tab 布局文件有7个, 主界面acitivity.layout <Linear ...

  9. 慕课网-安卓工程师初养成-4-9 Java循环语句之 for

    来源:http://www.imooc.com/code/1425 Java 的循环结构中除了 while 和 do...while 外,还有 for 循环,三种循环可以相互替换. 语法: 执行过程: ...

随机推荐

  1. Django之路由控制配置

    路由控制配置 简单的路由配置 Django即支持1.x版本的路由配置也支持2.x的路由配置 1.x版本的路由配置是使用re进行路由配置(re_path) 2.x版本的路由配置使用(path)进行路由配 ...

  2. CF1120 C. Compress String(SAM+DP)

    有方程dp[i]=min(dp[i-1]+A,dp[j]+B):如果s[j+1,i]在s[i,j]中出现,所以我们就是要知道每个子串在s出现的第一个位置,这个可以hash实现或者sam,或者kmp实现 ...

  3. 两个Inline-block元素不对齐

    可能是有一个元素用了overflow:hidden,(给另一个元素也加上) 也有可能是基线没对齐,用vertical-align:top可以

  4. P1441 砝码称重(搜索+队列dp)

    题目链接:传送门 题目大意: 给你n个砝码ai,从中去掉m个后求最多的砝码可表示的重量. n≤20,m≤4,m<n,ai≤100. 思路: 用dfs搜掉m个砝码,然后用队列dp跑出答案,维护答案 ...

  5. lesson1-fastai

    fast-ai系统资料https://www.jianshu.com/p/2fe22a6b0ecb 中文视频 https://www.bilibili.com/video/av10156946/ind ...

  6. 20155208 实验四 Android开发基础

    20155208 实验四 Android开发基础 实验内容 1.基于Android Studio开发简单的Android应用并部署测试; 2.了解Android.组件.布局管理器的使用: 3.掌握An ...

  7. HDU2029:Palindromes _easy version

    Problem Description "回文串"是一个正读和反读都一样的字符串,比如"level"或者"noon"等等就是回文串.请写一个 ...

  8. 2017.7.11 fuse工作原理

    FUSE的工作原理如图所示.假设基于FUSE的用户态文件系统hello挂载在/tmp/fuse目录下.当应用层程序要访问/tmp/fuse下的文件时,通过glibc中的函数进行系统调用,处理这些系统调 ...

  9. mysqldump命令之常用选项

    ===============================================mysqldump常用选项-h, --host=name:服务器IP-u, --user=name:登录名 ...

  10. 怎样解题 (G. 波利亚 著)

    第一部分 (已看) 目的 1. 帮助学生 2. 问题,建议,思维活动 3. 普遍性 4. 常识 5. 教师和学生,模仿和实践 主要部分,主要问题 6. 四个阶段 7. 理解题目 8. 例子 9. 拟订 ...