MongoDB是目前工作中经常使用到的NoSQL数据库。

本博客只记录相关理论知识和技巧,涉及到实践的部分都会单开Blog来记录实践过程。

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

体系结构:

一般一个MongoDB Server包含一个实例和多个数据库,也可以多个实例和多个数据库。

MongoDB默认数据目录是/data/db,它存储所有mongodb的数据文件。

每个数据库都包含一个.ns文件和一些数据文件,而且这些数据文件会随着数据量的增加越来越多。

MongoDB内部有预分配空间的机制,每个预分配的文件都用0进行填充。

数据文件每新分配一次,它的大小都是上一个数据文件大小的2倍,每个数据文件最大2G。

MongoDB每个集合和每个索引都对应一个命名空间,这些命名空间的元数据集中在16M的*.ns文件中,平均每个命名占用约 628 字节,也即整个数据库的命名空间的上限约为24000。

如果每个集合有一个索引(比如默认的_id索引),那么最多可以创建12000个集合。如果索引数更多,则可创建的集合数就更少了。同时,如果集合数太多,一些操作也会变慢。

要建立更多的集合的话,MongoDB 也是支持的,只需要在启动时加上“--nssize”参数,这样对应数据库的命名空间文件就可以变得更大以便保存更多的命名。这个命名空间文件(.ns文件)最大可以为 2G。

每个命名空间对应的盘区不一定是连续的。与数据文件增长相同,每个命名空间对应的盘区大小都是随分配次数不断增长的。目的是为了平衡命名空间浪费的空间与保持一个命名空间数据的连续性。

需要注意的一个命名空间$freelist,这个命名空间用于记录不再使用的盘区(被删除的Collection或索引)。每当命名空间需要分配新盘区时,会先查看$freelist是否有大小合适的盘区可以使用,如果有就回收空闲的磁盘空间。

MongoDB默认存储数据目录为/data/db,默认端口为27017,默认HTTP端口为28017。

MongoDB一般参数:

Journal -- 开启日志,通过保存操作日志来降低单机故障恢复的时间。

Syncdelay -- 系统同步刷新磁盘的时间,单位为秒,默认60秒。

Repairpath – 执行repair时的临时目录,在如果没有开启journal,异常down机后重启,必须执行repair操作。

执行mongod –help可以看见对大多数参数的解释。

停止mongodb:

(1)Ctrl + C

(2)>mongo –port 20813

>use admin

>db.shutdownserver();

(3)kill -2 PID

不要预先插入集合,在第一次插入的时候会自动创建。

使用find查询时,如果数据过多则不会全部显示,使用it命令继续迭代输出。

>it (迭代输出)

MongoDB每个文档都有一个默认的主键_id,这个主键名称是固定的。可以是MongoDB支持的任何数据类型,默认是ObjectId。但同一个集合中_id类型必须唯一,且不能插入值相同的数据。

创建数据库

use dbname

这样就创建了一个数据库。如果什么都不操作离开的话,这个库就会被系统删除。

show dbs  //查看数据库

show collections  //查看集合

基本操作

db.collection.update({a:99},{$set:{a:2}})  //update

db.collection.remove({a:2})   //remove {a:2}

db.collection.remove()   //remove all

db.collection.find()

db.collection.find({name:”mongo”})

db.collection.findOne({name:”mongo”})

db.collection.find({a:{$gt:3}})  // a > 3

db.collection.find({a:{$lt:5}})  // a < 5

db.collection.find({a:{$gte:3}})  // a >= 3

db.collection.find({a:{$lte:5}})  // a <= 5

db.collection.find({a:{$gte:3,$lte:5}})  // 3 <= a <= 5

db.collection.find({a:{$all:[6,8]}})  //不同于$in,$in满足其中一个值,$all必须满足所有值。

db.collection.find({a:{$exists:true}})  //存在a字段的记录

db.collection.find({a:null}})  //a字段为null或者不存在a字段都会查询出来

db.collection.find({a:{$in:[null],$exists:true}}})  //只查询出a为null的记录

db.collection.find({age:{$mod:[3,1]}})  //查询出age模3等于1的记录

db.collection.find({age:{$ne:7}})  // age<>7

db.collection.find({age:{$in:[7,8]}})  //显示age为7或8的记录

db.collection.find({age:{$nin:[7,8]}})  //查询age值在7,8外的记录

db.collection.find({name:’Sue’},{$pull:{‘languages’:’scala’}});   //移除数组中的项

db.collection.find({name:’Sue’},{$push:{‘languages’:’ruby’}});  //加入数组中的项

db.collection.find().limit(5);  //返回最前面的5条

db.collection.find().limit(0);  //返回所有记录

db.collection.find().skip(2);  //返回时跳过前2条

db.collection.find().sort({­a:1}) //排序:1升序,-1降序

db.collection.count();  //返回所有记录数

db.collection.find().limit(5).count();  //返回所有记录数

db.collection.find().limit(5).count(true);  //返回限制后的记录数

db.testcoll.find({},{col:true})   //只查询col列

db.testcoll.find({‘_id’:ObjectId(‘1234567890’)});  //按主键查询

查询嵌入的document

 db.people.find({"name" : {"first" : "Joe", "last" : "Schmoe"}})

要加一个middle name,这个查询就不行了,这种查询必须匹配整个嵌入的document,而且key是有顺序.

db.people.find({"name.first" : "Joe"})

这样可以直接查询嵌入文档中的key。因此document中的key不能包含”.”。

更新嵌套文档

db.testcoll.update({“name”: {"first" : "Joe"},{$set: {"first" : "Joe123"}}})  //更新嵌套文档

db.testcoll.update({'b.c':'123'},{$set:{'b.c':'456'}})

capped collection

capped collection有固定大小,以LRU规则自动维护插入顺序。

在创建时要预先指定大小,空间用完,新添加的对象会替代最旧的对象。

不允许删除,但可以调用drop()删除集合中的所有行,但drop后需要显示的重建集合。32位机上capped collection的最大值482.5M,64位只受系统文件大小的限制。

常见用途:

MongoDB中日志机制的首选:MongoDB没有使用日志文件,而是把日志存储在数据库中。

在一个没有索引的capped collection中插入对象的速度与在文件系统中记录日志的速度相当。

Cache:需要在capped collection上建一个索引,因为读比写多。

Auto Archiving:利用capped collection的age-out特性,省去了写cron做人工归档的工作。

如果capped collection的写比读多,最好不要在上面建索引,否则速度从log speed降到database speed。

使用nature ording可以有效地检索最近插入的元素,因为capped collection能保证自然排序就是插入时的顺序,类似于log文件上的tail操作。

db.createCollection(“testcoll”,{capped:true,size:100000,max:100,autoIndexId:false});

capped – 是否为capped collection。

size – 占用空间大小(bytes)。

max – 最大的document记录数,max=1 无限制。

autoIndexId  -- 是否在_id列上自动创建索引。

db.testcoll.validate();   //查看一个collection使用空间

默认对一般collection建立索引,但是不对capped collection建立索引。

GridFS

使用两个表来存储:

files包含元数据对象,chunks包含其它一些相关信息的二进制块。为了使多个GridFS命名为一个单一的数据库,文件和块都有一个前缀,默认情况下前缀是fs,所以任何默认的GridFS存储包括命名空间fs.files和fs.chunks。

./mongofiles put testfile  //存储文件

./mongofiles list   //列出存储的文件

show collections  //查看集合存储文件

db.fs.files.find()   //查看fs.files中的内容

结果中:

Filename -- 文件名

Chunksize – chunks分块大小

uploadDate – 分块时间

md5 – 文件的md5值

length –文件大小字节

fs.files中存储的是元数据信息

db.fs.chunks.find()   //查看fs.chunks中的内容

结果中:n代表chunks的序号

fs.chunks中存储的是文件实际内容数据

./mongofiles get testfile  //取出文件

md5sum testfile  //md5校验 – 跟gridfs中文件存储的md5相同

为gridfs的chunks建立索引

db.fs.chunks.ensureIndex({files_id:1,n:1},{unique:true});

一个块就可以用他的files_id和n值进行检索.

即查询块:

db.fs.chunks.findOne({files_id:myFileID,n:0});

时就会用到索引提高查询速度。

命令行操作

使用eval执行语句:

./mongo testcoll --eval "printjson(db.testcoll.count())

返回testcoll集合总记录数

执行指定文件中的内容:

./mongo --quiet t1_count.js

执行js脚本内容,--quiet参数去除登录信息,使结果更清晰.

进程控制

查看活动进程:

db.currentOp()

响应:

Opid – 操作进程号

Op – 操作类型

Ns – 命名空间

Query – 如果操作类型是查询,显示查询内容

LockType – 读锁还是写锁

结束进程:

db.killOp(opid);

不要kill内部发起的操作,如replica set发起的sync操作。

索引

索引信息被保存在system.indexes中,默认总是为_id创建索引。

db.testcoll.ensureIndex({age:1});  //在age上创建索引,1升序,-1降序

db.testcoll.ensureIndex({age:1},{backgroud:true}); //当已有大量数据时,在后台创建索引。

db.testcoll.getIndexes();   //查看索引

_id索引是自动创建的索引,这个索引是不能删除的。

文档索引

索引可以是任何类型的字段甚至文档。

db.testcoll.insert({name:123,addr{city:Beijing,state:BJ}})

建立索引:db.ensureIndex({addr:1})

查询时必须按照建立索引的文档顺序查询,才能用到索引:

db.testcoll.find({addr{city:Beijing,state:BJ}})

下面的不会用到索引:

db.testcoll.find({addr{state:BJ, city:Beijing}})

组合索引

db.ensureIndex({‘addr.city’:1,’addr.state’:-1})

查询时:只按{addr.city}查询或排序会用到索引,或者按{addr.city,addr.state}顺序查询或排序也会用到索引。

唯一索引

db.testcoll.ensureIndex({firstname:1,lastname:1},{unique:true})  //创建

如果数据库中已有重复记录则无法创建唯一索引。

查询时强制使用索引

db.testcoll.ensureIndex({name:1,age:1})  //建立组合索引

db.testcoll.find({age:{$lt>30}})  //查询时不会使用到索引

db.testcoll.find({age:{$lt>30}}).hint({name:1,age:1})  //查询时强制使用索引,必须是已创建的索引。

删除索引

db.testcoll.dropIndexes()    //删除集合中所有索引

db.testcoll.dropIndexes({firstname:1})  //删除集合中某个索引

查看系统如何处理查询请求

db.testcoll.find().explain()

优化器Profile 性能优化(略)

性能监控

Mongosniff:从底层监控到底哪些指令发送给了MongoDB去执行。

Mongostat:查看某组运行中mongodb实例的统计信息。

db.serverStatus() :查看实例运行状态的命令。

db.stats():查看数据库状态信息。


转自:http://shensy.iteye.com/blog/1489947

转载:MongoDB之旅(超赞,适合初学者)的更多相关文章

  1. 海量的超赞 Linux 软件 (转载)

    海量的超赞 Linux 软件 作者: VoLuong 译者: LCTT Mo | 2016-08-24 16:01   评论: 27 收藏: 38 这个仓库收集了对任何用户/开发者都超赞的 Linux ...

  2. 不容错过的超赞项目管理PPT

    不容错过的超赞项目管理PPT(转载) 大公司的一个好处,是各个领域都有牛人,可以为你提供经验分享交流.腾讯庞大的培训体系更是保证了:如果你想学点什么东西,你总可以学到.腾讯内部资源30页PPT曝光 — ...

  3. 推荐10个适合初学者的 HTML5 入门教程

    HTML5 作为下一代网站开发技术,无论你是一个 Web 开发人员或者想探索新的平台的游戏开发者,都值得去研究.借助尖端功能,技术和 API,HTML5 允许你创建响应性.创新性.互动性以及令人惊叹的 ...

  4. 分享29个超赞的响应式Web设计

    原文自:http://www.csdn.net/article/2013-01-16/2813678-responsive-design-websites 最近几年,响应式Web设计不断印入人们眼帘, ...

  5. Vue slot-scope的理解(适合初学者)

    百度上已经有很多的关于slot-scope的文章,但我感觉都是那些以前没学好,又回头学的人,他们都使用了.Vue文件,我觉得有点不适合初学者,所以我就写一篇适合初学者的. 先抛例程: <!DOC ...

  6. GitHub 和 Gitee 开源免费 10 个超赞后台管理面板,看完惊呆了!

      软件工程师在实际项目开发中不可避免需要依赖一些前后端的后台管理系统框架,而不是从零开始一点点的搭建,浪费人力.目前市面上有很多开放源码.且免费的后台管理面板,样式色彩也比较丰富美观.   今天整理 ...

  7. [C#] Timer + Graphics To Get Simple Animation (简单的源码例子,适合初学者)

    >_<" 这是一个非常简单的利用C#的窗口工程创立的程序,用来做一个简单的动画,涉及Timer和Graphics,适合初学者,高手略过~

  8. Pace.js – 超赞的页面加载进度自动指示和 Ajax 导航效果

    在页面中引入 Pace.js  和您所选择主题的 CSS 文件,就可以让你的页面拥有漂亮的加载进度和 Ajax 导航效果.不需要挂接到任何代码,自动检测进展.您可以选择颜色和多种效果,有简约,闪光灯, ...

  9. 5、WPF实现简单计算器-非常适合初学者练习

    Sample Calculator 这是微软社区WPF的一个示例,在源程序的基础上我进行了一点点修改,非常适合初学者练习,详细代码解释. 源程序的下载地址 http://code.msdn.micro ...

随机推荐

  1. 8张思维导图学习javascript

    分别归类为: javascript变量 javascript运算符 javascript数组 javascript流程语句 javascript字符串函数 javascript函数基础 javascr ...

  2. 118/119. Pascal's Triangle/II

    原文题目: 118. Pascal's Triangle 119. Pascal's Triangle II 读题: 杨辉三角问题 '''118''' class Solution(object): ...

  3. python 获取命令行参数

    https://www.cnblogs.com/captain_jack/archive/2011/01/11/1933366.html zzz.py import sys from optparse ...

  4. C# 获取汉字转拼音缩写-简写,不是全拼

    ///<summary> /// 汉字转拼音缩写 /// Code By         ] -'\0')); if ( i <0xB0A1) return"*" ...

  5. qt 中的基本知识

    1. 由 .ui 文件生成界面头文件: uic -o ui_dialog.h dialog.ui 2. 在工程目录下生成与平台无关的工程文件 : qmake -project 3. 生成与平台相关的  ...

  6. 了解一些dos常用命令

    备注:[] ——可选项   <>——必填项 DOS 特殊命令应用技巧: 向上箭头“↑”和向下箭头“↓”——回看上一次执行的命令 "Ctrl+C"组合——中断操作 在命令 ...

  7. Java中递归的优缺点,Java写一个递归遍历目录下面的所有文件包括子文件夹里边的文件。

    题目: 遍历出aaa文件夹下的文件 首先分析思路: 1.首先判断这个文件夹是否为文件,通过isFile()函数可以判断是否为文件. 2.然后通过isDirectory判断是否为目录. 3.如果是目录就 ...

  8. git库上传

    1.第一步,拉下项目 2.添加 3.提交到本地和仓库

  9. python return 及lambda函数

    return有两个作用: 1.用来返回函数的运行结果,或者调用另外一个函数.比如max()函数 >>> def fun(a,b): #返回函数结果. return max(a,b) ...

  10. Android学习路-activity活动

    activity即活动,是一种包含用户界面的组件,用于与用户进行交换   创建activity类 1.类继承Activity, activity传递一个bundle对象,可以获得onSaveInsta ...