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():查看数据库状态信息。

MongoDB的一些用法(转藏)的更多相关文章

  1. MongoDB高级查询用法大全

    转载 http://blog.163.com/lgh_2002/blog/static/440175262012052116455/ 详见官方的手册: http://www.mongodb.org/d ...

  2. mongodb聚合管道用法

    基本用法 db.collection.aggregate( [ { <stage> }, ... ] ) stage如下 名称 描述 $addFields 将新的字段添加到文档中,输出的文 ...

  3. mongoDB 特别指令用法

    http://apluck.iteye.com/blog/1176160 a.   修改collection集合字段名 参见:http://www.mongodb.org/display/DOCS/U ...

  4. mongoDB 索引的用法

    http://www.cnblogs.com/lipan/archive/2011/03/28/1997202.html MongoDB中的索引其实类似于关系型数据库,都是为了提高查询和排序的效率的, ...

  5. mongoDB的基本用法

    一.MongoDB初识 什么是MongoDB MongoDB是一个基于分布式文件存储的数据库.由c++语言编写.旨在为web应用提供可扩展的高性能数据存储解决方案. MongoDB是一个介于关系数据库 ...

  6. mongodb 查询的用法

    想要在C#中使用MongoDB,首先得要有个MongoDB支持的C#版的驱动.C#版的驱动貌似有很多种,如官方提供的samus. 实现思路大都类似.这里我们用官方提供的mongo-csharp-dri ...

  7. MongoDB数据库基本用法

    show dbs:显示数据库列表  show collections:显示当前数据库中的集合(类似关系数据库中的表)  show users:显示用户 use <db name>:切换当前 ...

  8. Mongodb查询的用法,备注防止忘记

    最近在用这个东西,为防止忘记,记下来. 集合简单查询方法 mongodb语法:db.collection.find()  //collection就是集合的名称,这个可以自己进行创建. 对比sql语句 ...

  9. MongoDB的MapReduce用法及php示例代码

    MongoDB虽然不像我们常用的mysql,sqlserver,oracle等关系型数据库有group by函数那样方便分组,但是MongoDB要实现分组也有3个办法: * Mongodb三种分组方式 ...

随机推荐

  1. NHibernate构建一个ASP.NET MVC应用程序

    NHibernate构建一个ASP.NET MVC应用程序 什么是Nhibernate? NHibernate是一个面向.NET环境的对象/关系数据库映射工具.对象/关系数据库映射(object/re ...

  2. HDU 5001 概率DP || 记忆化搜索

    2014 ACM/ICPC Asia Regional Anshan Online 给N个点,M条边组成的图,每一步能够从一个点走到相邻任一点,概率同样,问D步后没走到过每一个点的概率 概率DP  測 ...

  3. 怎样下载并编译Android4.0内核源代码goldfish(图文)

    关于怎样下载Android4.0源代码,请查看我的博客内还有一篇文章(相同是图文教程): http://blog.csdn.net/flydream0/article/details/7036156 ...

  4. WimMaker 2.0 (2013.10) WIM制作工具

    WimMaker 2.0 (2013.10) WIM制作工具 可用于制作PE启动内核的Wim文件 说明: 因本软件使用.NET2.0制作,故主要用于制作WIM映像不用于备份还原系统(虽可用,但不专业, ...

  5. SQL点滴1—SET QUOTED_IDENTIFIER OFF语句的作用

    原文:SQL点滴1-SET QUOTED_IDENTIFIER OFF语句的作用 先看下面几个sql语句 代码   SELECT * FROM [USER]    WHERE a= 'netasp' ...

  6. 有return如果是try catch finally运行命令

    背景: 昨天一个朋友出去采访,遇到这样的问题:"C#  catch那里return.finally也弄它运行?" 个人总结实践: 1.无论有木有出现异常.finally块中代码都会 ...

  7. 深入了解jsonp解决跨域访问

    在这个项目中,我们做的充分利用jsonp这是一个特点跨界,完成简单的单点登录认证和权限控制的统一.道,各有各的优点.各有各的优点,选择什么方式实现全然取决于我们自己或者项目经理的开发经验,对各种框架的 ...

  8. 使用rem设计移动端自适应页面一(转载)

    1.困扰多时的问题 在这之前做Web App开发的的时候,在自适应方面一般都是宽度通过百分比,高度以iPhone6跟iPhone5之间的一个平衡值写死,我们的设计稿都是iPhone5的640 * 11 ...

  9. 看AngularJS

    最近一段时间一直在看AngularJS,趁着一点时间总结一下. 官网地址:http://angularjs.org/ 先推荐几个教程 1. AngularJS入门教程 比较基础,是官方Tutorial ...

  10. How To Configure Logging And Log Rotation In Apache On An Ubuntu VPS

    Introduction The Apache web server can be configured to give the server administrator important info ...