《MongoDB权威指南》学习整理----MongoDB进阶指南

来源:互联网 发布:成都泰迪熊博物馆淘宝 编辑:程序博客网 时间:2024/05/19 00:42

数据库命令

MongoDB中的数据库命令都是通过db.runCommand({命令:参数})来执行的,runCommand命令在MongoDB中是以特殊的方式来处理的,即通过$cmd集合的操作来执行。

常见的MongoDB命令

  • buildInfo

{'buildInfo':1}

管理专用命令,返回MongoDB服务器的版本号和主机的操作系统。

  • collStats

{'collStats':collection}

返回指定集合的统计信息,包括数据大小、已分配的存储空间和索引相关信息

  • distinct

{'distinct':collection,'key':key,'query':query}

列出指定集合中满足查询条件的文档的指定键的不同值

  • drop

{'drop':collection}

删除集合的所有数据

  • dropDatabase

{'dropDatabase':1}

删除当前数据库的所有数据

  • dropIndexes

{'dropIndexes':collecion,'index':name}

删除指定集合中的指定索引,如果name为*则删除所有索引

  • findAndMotify

详见MongoDB中的查询中的解释

  • getLastError

{'getLastError':1[,'w':w[,'wtimeout':timeout]]}

查看对本集合执行的最后一次操作的错误信息或者其他状态信息。在w台服务器复制集合的最后操作之前,这个命令会祖舍

  • isMaster

{'isMaster':1}

检查本服务器是主服务器还是从服务器

  • ListCommands

{'ListCommands':1}

返回所有可以在服务器上运行的命令及相关信息

  • listDatabases
  • {'listDatabase':1}

管理专用命令,列出服务器上所有的数据库

  • ping

{'ping':1}

检查服务器链接是否正常

  • renameCollection

{'renameCollection':a,'to':b}

将集合a重命名为b。

  • repairDatabase

{'repairDatabase':1}

修复并压缩当前数据库,属于耗时操作。

  • serverStatus

{'serverStatus':1}

返回这台服务器的管理统计信息

  • convertToCapped

{'convertToCapped':collectionName,size:最大字节数}

将普通集合转化为固定集合。

固定集合

简介

MongoDB中一般的集合都是会随着集合中文档的增加而扩充,而MongoDB中还提供了一种特殊的集合:固定集合。这种集合的特性就是集合的空间大小是确定的(注意是空间大小,而不是文档数量),当空间使用完成后插入的话MongoDB会将该集合中最早的文档删除。而且固定集合不能删除文档、保证文档是按插入顺序保存的。默认情况下没有索引。

特性:

插入速度极快,由于默认情况下没有索引;按插入顺序输出速度极快;自动淘汰历史数据。

特别适合于保存日志文档、缓存少量文档。

自然排序

固定集合中的数据都是按照自然排序(磁盘顺序)保存的,所以在查询排序的时候,可以使用find().sort({'natrue':1/-1})来使得查询的数据与插入的顺序一致或相反。

尾部游标

类似于Linux中的tail -t 命令,在查询命令执行后,游标并不会关闭,而是一致活动并输出最新最后的数据。只能用在固定集合上。

创建:

由于固定集合的特殊性,它的创建和普通的集合不同,普通的集合不需要显式创建,当insert的时候MongoDB会自动创建这个集合。而固定集合必须是使用createCollection命令显式创建:

db.createCollection(collectionName,{capped:是否固定集合,size:字节大小[,autoIndexId:自动创建_id索引,默认不创建,max:最大文档数}])

注意,虽然可以同时指定最大字节数和最大文档数,但是只有容量不满的时候才会依据最大文档数判断。

服务器端JS脚本

由于mongoDB对JS脚本很好的支持,我们可以通过定义一个全局的JS脚本(这个脚本可以存储在MongoDB数据库中)来避免重复复杂性工作。

方法

db.eval(funtionObj,params)

说明

params是一个数组,存放一组参数。

MongoDB中的JS脚本存放在system.js集合中,可以通过指定"_id"来指定该函数的名称,方便调用:

system.js.insert({'_id':functionName,'value':function(){

函数逻辑

}})

也可以向system.js中假如一些全局JS变量:

system.js.insert({'_id':全局变量名,'value':变量值}

安全性

注意,对于JS的eval函数(python中同样有eval函数和类似的exec函数)。我们都知道,在使用eval的时候都需要小心谨慎。那么在MongoDB这种涉及到数据存储的情况,我们更是需要小心,否则虽然MongoDB自身防止了"注入攻击",但是如果db.eval使用不慎的话任然会造成类似于注入攻击的效果。为了防止这种情况发生,我们需要给变量提供一个作用域。这里先记录下来以后用到的时候来仔细讲解。

 

数据库引用

数据库引用类似于URI,即通过某一种特殊格式的字符串定位到某个MongoDB实例中某个数据库中某个集合中的某个文档对象。

方法

{'$ref':collection,'$id':id_value[,'$db':DBName}

说明

以上就可以在使用文档的时候,通过以上的方式引用到某个目标文档上。

数据库的引用一般只适用于在本集合中不同的文档需要对不同的集合引用才需要,否则一般可以使用类似于外键(这里的外键只是概念上的,MongoDB中并没有建立约束检查)的形式,即某个字段只存另一个集合的_id属性值即可。

0 0