MongoDB的使用

什么是MongoDB?

mongodb是一个基于分布式文件储存的数据库,由C 编写。是一个文档型数据库,提供好的性能,领先的非关系型数据库

MongoDB的储存形式类似于python的字典,以{‘key’:‘value’}的形式储存

mongoDB适用于哪些场景?

1.网站数据量大

2,网站数据读写操作频繁

3.价值较低

数据库mysql和mongdb的区别?

SQL:mysql、Oracle、sqlserver、db2

  1. 高度事务性场景:银行、会计、贸易,库管,需要大量原子性操作
  1. 适合存储结构化数据,如用户的帐号、地址,预先定义明确的字段
  1. 数据价值高、对安全性要求高、稳定性要求高
  1. 需要持久化存储的 “冷数据”(不需要经常读写的数据)
  1. 需要通过SQL语言做关联查询,比如join

6.这些数据的规模、增长的速度通常是可以预期的

NoSQL:

redis key:value(string、hash、set、zset、list)、

mongodb {“name” : “xiaoming”, “age” : 18}, {}

mongodb:字典格式,支持分组、索引、主从备份、集群

  1. 灵活的数据结构,适合存储非结构化数据,如文章、评论,需要事先设计 数据的增删改 的字段
  1. 高度收缩性场景,社交网络、热点资讯,NoSQL数据库通常具有无限(至少接近)伸缩性
  1. 处理 “热数据”(经常需要读写的数据),这些数据通常用于模糊处理,如全文搜索、机器学习
  1. 这些数据是海量的,而且增长的速度是难以预期的,更容易扩展
  1. 按key获取数据效率很高,但是对join或其他结构化查询的支持就比较差

大型互联网项目都会选用MySQL(或任何关系型数据库) NoSQL的组合方案

端口号:

mysql: 3306

redis: 6379

mongodb: 27017

mongodb安装教程

关于mongodb的好处,优点之类的这里就不说了,唯一要讲的一点就是mongodb中有三元素:数据库,集合,文档,其中“集合”

就是对应关系数据库中的“表”,“文档”对应“行”。

下载

上MongoDB官网 ,我们发现有32bit和64bit,这个就要看你系统了,不过这里有两点注意:

①:根据业界规则,偶数为“稳定版”(如:1.6.X,1.8.X),奇数为“开发版”(如:1.7.X,1.9.X),这两个版本的区别相信大家都知道吧。

②:32bit的mongodb最大只能存放2G的数据,64bit就没有限制。

我这里就下载”2.0.2版本,32bit“,ok,下载之后我就放到”E盘“,改下文件夹名字为”mongodb“。

启动

①:启动之前,我们要给mongodb指定一个文件夹,这里取名为”db”,用来存放mongodb的数据。

MongoDB的使用

②:微软徽标 R,输入cmd,首先找到“mongodb”的路径,然后运行mongod开启命令,同时用–dbpath指定数据存放地点为“db”文件夹。

MongoDB的使用

③:最后要看下是否开启成功,从图中的信息中获知,mongodb采用27017端口,那么我们就在浏览器里面键入“http://localhost:27017/”,

打开后,mongodb告诉我们在27017上Add 1000可以用http模式查看mongodb的管理信息。

MongoDB的使用

基本操作

由于是开篇,就大概地说下基本的“增删查改“,我们再开一个cmd,输入mongo命令打开shell,其实这个shell就是mongodb的客户端,

同时也是一个js的编译器,默认连接的是“test”数据库。

MongoDB的使用

insert 操作

好,数据库有了,下一步就是集合,这里就取集合名为“person”,要注意的就是文档是一个json的扩展(Bson)形式。

MongoDB的使用

find 操作

我们将数据插入后,肯定是要find出来,不然插了也白插,这里要注意两点:

① “_id”: 这个字段是数据库默认给我们加的GUID,目的就是保证数据的唯一性。

② 严格的按照Bson的形式书写文档,不过也没关系,错误提示还是很强大的。

MongoDB的使用

update操作

update方法的第一个参数为“查找的条件”,第二个参数为“更新的值”,学过C#,相信还是很好理解的。

MongoDB的使用

remove操作

remove中如果不带参数将删除所有数据,呵呵,很危险的操作,在mongodb中是一个不可撤回的操作,三思而后行。

MongoDB的使用

细说增删改查

有一天当我们用上一篇同样的方式打开mongodb,突然

傻眼了,擦,竟然开启不了,仔细观察“划线区域“的信息,发现db文件夹下有一个类似的”lock file”阻止了mongodb的开启,接下来我们要做的就

是干掉它,之后,开启成功,关于mongodb的管理方式将在后续文章分享。

MongoDB的使用

一: Insert操作

上一篇也说过,文档是采用“K-V”格式存储的,如果大家对JSON比较熟悉的话,我相信学mongodb是手到擒来,我们知道JSON里面Value

可能是“字符串”,可能是“数组”,又有可能是内嵌的一个JSON对象,相同的方式也适合于BSON。

常见的插入操作也就两种形式存在:“单条插入”和“批量插入”。

① 单条插入

先前也说了,mongo命令打开的是一个javascript shell。所以js的语法在这里面都行得通,看起来是不是很牛X。

MongoDB的使用

② 批量插入

这玩意跟“单条插入”的差异相信大家应该知道,由于mongodb中没有提供给shell的“批量插入方法”,没关系,各个语言的driver都打通

了解mongodb内部的批量插入方法,因为该方法是不可或缺的,如果大家非要模拟下批量插入的话,可以自己写了for循环,里面就是insert。

二:Find操作

日常开发中,我们玩查询,玩得最多的也就是二类:

①: >, >=, <, <=, !=, =。

②:And,OR,In,NotIn

这些操作在mongodb里面都封装好了,下面就一一介绍:

“gt”, “gt“,”gte”, “lt”, “lt“,”lte”, “$ne”, “没有特殊关键字”,这些跟上面是一一对应的,举几个例子。

MongoDB的使用

“无关键字“, “or”, “or“,”in”,”$nin” 同样我也是举几个例子

MongoDB的使用

在mongodb中还有一个特殊的匹配,那就是“正则表达式”,这玩意威力很强的。

MongoDB的使用

有时查询很复杂,很蛋疼,不过没关系,mongodb给我们祭出了大招,它就是where,为什么这么说,是因为where,为什么这么说,是因为where中的value

就是我们非常熟悉,非常热爱的js来助我们一马平川。

MongoDB的使用

三:Update操作

更新操作无非也就两种,整体更新和局部更新,使用场合相信大家也清楚。

整体更新

不知道大家可还记得,我在上一篇使用update的时候,其实那种update是属于整体更新。

MongoDB的使用

局部更新

有时候我们仅仅需要更新一个字段,而不是整体更新,那么我们该如何做呢?easy的问题,mongodb中已经给我们提供了两个

修改器: inc 和inc和set。

① $inc修改器

$inc也就是increase的缩写,学过sql server 的同学应该很熟悉,比如我们做一个在线用户状态记录,每次修改会在原有的基础上

自增$inc指定的值,如果“文档”中没有此key,则会创建key,下面的例子一看就懂。

MongoDB的使用

② $set修改器

啥也不说了,直接上代码

MongoDB的使用

upsert操作

这个可是mongodb创造出来的“词”,大家还记得update方法的第一次参数是“查询条件”吗?,那么这个upsert操作就是说:如果我

没有查到,我就在数据库里面新增一条,其实这样也有好处,就是避免了我在数据库里面判断是update还是add操作,使用起来很简单

将update的第三个参数设为true即可。

MongoDB的使用

批量更新

在mongodb中如果匹配多条,默认的情况下只更新第一条,那么如果我们有需求必须批量更新,那么在mongodb中实现也是很简单

的,在update的第四个参数中设为true即可。例子就不举了。

四: Remove操作

这个操作在上一篇简单的说过,这里就不赘述了。

细说高级操作

今天跟大家分享一下mongodb中比较好玩的知识,主要包括:聚合,游标。

一: 聚合

常见的聚合操作跟sql server一样,有:count,distinct,group,mapReduce。

count

count是最简单,最容易,也是最常用的聚合工具,它的使用跟我们C#里面的count使用简直一模一样。

MongoDB的使用

distinct

这个操作相信大家也是非常熟悉的,指定了谁,谁就不能重复,直接上图。

MongoDB的使用

group

在mongodb里面做group操作有点小复杂,不过大家对sql server里面的group比较熟悉的话还是一眼

能看得明白的,其实group操作本质上形成了一种“k-v”模型,就像C#中的Dictionary,好,有了这种思维,

我们来看看如何使用group。

下面举的例子就是按照age进行group操作,value为对应age的姓名。下面对这些参数介绍一下:

key: 这个就是分组的key,我们这里是对年龄分组。

initial: 每组都分享一个”初始化函数“,特别注意:是每一组,比如这个的age=20的value的list分享一个

initial函数,age=22同样也分享一个initial函数。

$reduce: 这个函数的第一个参数是当前的文档对象,第二个参数是上一次function操作的累计对象,第一次

为initial中的{”perosn“:[]}。有多少个文档, $reduce就会调用多少次。

MongoDB的使用

看到上面的结果,是不是有点感觉,我们通过age查看到了相应的name人员,不过有时我们可能有如下的要求:

①:想过滤掉age>25一些人员。

②:有时person数组里面的人员太多,我想加上一个count属性标明一下。

针对上面的需求,在group里面还是很好办到的,因为group有这么两个可选参数: condition 和 finalize。

condition: 这个就是过滤条件。

finalize:这是个函数,每一组文档执行完后,多会触发此方法,那么在每组集合里面加上count也就是它的活了。

MongoDB的使用

mapReduce

这玩意算是聚合函数中最复杂的了,不过复杂也好,越复杂就越灵活。

mapReduce其实是一种编程模型,用在分布式计算中,其中有一个“map”函数,一个”reduce“函数。

① map:

这个称为映射函数,里面会调用emit(key,value),集合会按照你指定的key进行映射分组。

② reduce:

这个称为简化函数,会对map分组后的数据进行分组简化,注意:在reduce(key,value)中的key就是

emit中的key,vlaue为emit分组后的emit(value)的集合,这里也就是很多{“count”:1}的数组。

③ mapReduce:

这个就是最后执行的函数了,参数为map,reduce和一些可选参数。具体看图可知:

MongoDB的使用

从图中我们可以看到如下信息:

result: “存放的集合名“;

input:传入文档的个数。

emit:此函数被调用的次数。

reduce:此函数被调用的次数。

output:最后返回文档的个数。

最后我们看一下“collecton”集合里面按姓名分组的情况。

MongoDB的使用

游标

mongodb里面的游标有点类似我们说的C#里面延迟执行,比如:

var list=db.person.find();

针对这样的操作,list其实并没有获取到person中的文档,而是申明一个“查询结构”,等我们需要的时候通过

for或者next()一次性加载过来,然后让游标逐行读取,当我们枚举完了之后,游标销毁,之后我们在通过list获取时,

发现没有数据返回了。

MongoDB的使用

当然我们的“查询构造”还可以搞得复杂点,比如分页,排序都可以加进去。

var single=db.person.find().sort({“name”,1}).skip(2).limit(2);

那么这样的“查询构造”可以在我们需要执行的时候执行,大大提高了不必要的花销。

MongoDB的使用

索引操作

好,今天分享下mongodb中关于索引的基本操作,我们日常做开发都避免不了要对程序进行性能优化,而程序的操作无非就是CURD,通常我们

又会花费50%的时间在R上面,因为Read操作对用户来说是非常敏感的,处理不好就会被人唾弃,呵呵。

从算法上来说有5种经典的查找,具体的可以参见我的算法速成系列,这其中就包括我们今天所说的“索引查找”,如果大家对sqlserver比较了解

的话,相信索引查找能给我们带来什么样的性能提升吧。

我们首先插入10w数据,上图说话:

MongoDB的使用

一:性能分析函数(explain)

好了,数据已经插入成功,既然我们要做分析,肯定要有分析的工具,幸好mongodb中给我们提供了一个关键字叫做“explain”,那么怎么用呢?

还是看图,注意,这里的name字段没有建立任何索引,这里我就查询一个“name10000”的姓名。

MongoDB的使用

仔细看红色区域,有几个我们关心的key。

cursor: 这里出现的是”BasicCursor”,什么意思呢,就是说这里的查找采用的是“表扫描”,也就是顺序查找,很悲催啊。

nscanned: 这里是10w,也就是说数据库浏览了10w个文档,很恐怖吧,这样玩的话让人受不了啊。

n: 这里是1,也就是最终返回了1个文档。

millis: 这个就是我们最最最….关心的东西,总共耗时114毫秒。

建立索引(ensureIndex)

在10w条这么简单的集合中查找一个文档要114毫秒有一点点让人不能接受,好,那么我们该如何优化呢?mongodb中给

我们带来了索引查找,看看能不能让我们的查询一飞冲天…..

MongoDB的使用

这里我们使用了ensureIndex在name上建立了索引。”1“:表示按照name进行升序,”-1“:表示按照name进行降序。

我的神啊,再来看看这些敏感信息。

cursor: 这里出现的是”BtreeCursor”,这么牛X,mongodb采用B树的结构来存放索引,索引名为后面的“name_1″。

nscanned: 我数据库只浏览了一个文档就OK了。

n: 直接定位返回。

millis: 看看这个时间真的不敢相信,秒秒杀。

通过这个例子相信大家对索引也有了感官方面的认识了吧。

唯一索引

和sqlserver一样都可以建立唯一索引,重复的键值自然就不能插入,在mongodb中的使用方法是:

db.person.ensureIndex({“name”:1},{“unique”:true})。

MongoDB的使用

组合索引

有时候我们的查询不是单条件的,可能是多条件,比如查找出生在‘1989-3-2’名字叫‘jack’的同学,那么我们可以建立“姓名”和”生日“

的联合索引来加速查询。

MongoDB的使用

看到上图,大家或者也知道name跟birthday的不同,建立的索引也不同,升序和降序的顺序不同都会产生不同的索引,

那么我们可以用getindexes来查看下person集合中到底生成了哪些索引。

MongoDB的使用

此时我们肯定很好奇,到底查询优化器会使用哪个查询作为操作,呵呵,还是看看效果图:

MongoDB的使用

看完上图我们要相信查询优化器,它给我们做出的选择往往是最优的,因为我们做查询时,查询优化器会使用我们建立的这些索引来创建查询方案,

如果某一个先执行完则其他查询方案被close掉,这种方案会被mongodb保存起来,当然如果非要用自己指定的查询方案,这也是

可以的,在mongodb中给我们提供了hint方法让我们可以暴力执行。

MongoDB的使用

删除索引

可能随着业务需求的变化,原先建立的索引可能没有存在的必要了,可能有的人想说没必要就没必要呗,但是请记住,索引会降低CUD这三

种操作的性能,因为这玩意需要实时维护,所以啥问题都要综合考虑一下,这里就把刚才建立的索引清空掉来演示一下:dropIndexes的使用。

MongoDB的使用

mapreduce

内容出处:,

声明:本网站所收集的部分公开资料来源于互联网,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。如果您发现网站上有侵犯您的知识产权的作品,请与我们取得联系,我们会及时修改或删除。文章链接:http://www.yixao.net/soft/21679.html

发表评论

登录后才能评论