zoukankan      html  css  js  c++  java
  • MongoDB学习笔记-06 数据库命令、固定集合、GridFS、javascript脚本

    介绍MongoDB支持的一些高级功能:

    数据库命令

    固定大小的集合

    GridFS存储大文件

    MongoDB对服务端JavaScript的支持

    数据库命令

    命令的原理

    MongoDB中的命令其实是作为一种特殊类型的查询来实现的,这些查询针对$cmd集合来执行。runCommand仅仅是接受命令文档,执行等价查询。

    >db.runCommand({"drop":"test"})

    clip_image001

    上面的命令等价于下面的查询:

    >db.$cmd.findOne({"drop":"test"})

    当MongoDB服务器得到查询$cmd集合的请求时,会启动一套特殊的逻辑来处理,而不是交给普通的查询代码来执行。

    有些 命令的访问需要管理员权限,必须在admin数据库里运行。否则会得到“拒绝访问”的错误。

    常见命令列表

    可以使用db.listCommand()列出MongoDB支持的所有命令。经常使用的命令如下:

    buildInfo:返回MongoDB服务器的版本号和主机的操作系统等信息

    >db.runCommand({"buildInfo":1})

    clip_image003

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

    >db.runCommand({"collStats":"collectionName"})

    clip_image004

    distinct:返回指定集合中满足查询条件的指定键的所有不同的值

    >db.runCommand({"distinct":"collectionName","key":"keyName","query":query})

    drop:删除指定集合

    >db.runCommand({"drop":"collectionName"})

    dropDatabase:删除db指向的数据库,

    >db.runCommand({"dropDatabase":1})

    dropIndexes:删除集合中指定名称的索引,名称为*时删除全部。

    >db.runCommand({"dropIndexes":"collectionName","index":"indexName"})

    findAndModify:返回已更新的文档

    >db.runCommand({"findAndModify":"collectionName","query":query, "sort":sort, "update":update})

    getLastError:返回对本集合执行的最后一次操作的错误信息或者其他状态信息。

    >db.runCommand({"getLastError":1})

    isMaster:检测本服务器是否为主服务器

    >db.runCommand({"isMaster":1})

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

    >db.runCommand({"listCommands":1})

    listDatabases:列出服务器上所有的数据库,与show dbs结果类似,管理员专用

    >db.runCommand({"listDatabases":1})

    ping:检测服务器连接是否正常

    >db.runCommand({"ping":1})

    renameCollection:重命名集合

    >db.runCommand({"renameCollection":a, "to":b})

    repairDatabase:修复并压缩当前数据库,db指向的数据库

    >db.runCommand({"repairDatabase":1})

    serverStatus:返回本服务器的管理统计信息

    >db.runCommand({"serverStatus":1})

    固定集合

    固定集合需要实现创建且大小固定(文档数量、容量)。插入文档时,若还有空间,则在尾部插入,否则最早的文档会被删除。默认情况下,固定集合是没有索引的,即便是”_id”.

    1)特点

    对固定集合进行插入速度快,插入实际上就是简单的memcpy(内存复制);文档本身按照插入的顺序存储;空间不够时,自动淘汰最早的数据。

    2)创建固定集合

    固定集合必须在使用前显示创建,使用createCollection()方法来创建:

    >db.createCollection("collectionName",{"capped":true,size:10000,max:100})

    size:指定集合的存储空间,单位字节

    max:指定文档的数量(可选)。

    当指定文档数量上限时,必须同时指定大小。淘汰机制只有在容量还没满时才会依据文档数量来工作。要是容量满了,会依据容量来工作。

    3)自然排序

    自然顺序就是文档在磁盘上的顺序。固定集合的文档总是按照插入的顺序存储的,自然顺序与此相同,也可以使用自然排序按照反方向插入的顺序查询:

    >db.my_collection.find().sort({"$natural":-1})

    4)尾部游标

    尾部游标是一种特殊的持久游标,不会在没有结果后销毁,只能用在固定集合上。

    GridFS:存储大文件

    GridFS是MongoDB中存储大二进制文件的机制,其特点有如下几方面:

    可以简化需求,不需要使用独立文件存储架构;直接利用已经建立的复制或分片机制,便于故障恢复和扩展;避免用于存储用户上传内容的文件系统出现问题;不产生磁盘碎片。

    使用GridFS:mongofiles

    利用mongofiles应用程序,可以用来在GridFS中上传、下载、列示、查看或删除文件。使用mongofiles --help查看所有选项。

    基本用法是:mongofiles [options] command [gridfs filename]

    命令有如下选择:list(列示)、search(查看)、put(上传)、get(下载)、delete(删除)

    >mongofiles put E:MongoDBdbDataUploadTest.txt

    >mongofiles list

    >mongofiles get E:MongoDBdbDataUploadTest.txt

    选项有如下的选择:

    -h[--host]:指定上传的主机地址,默认localhost

    --port:指定上传的端口号,默认27017

    -u[--username]:指定用户名

    -p[--password]:指定对应的密码

    --dbpath:指定数据文件存放路径

    -d[--db]:指定使用的数据库

    -c[--collection]:指定使用的集合

    -l[--local]:上传/下载时的本地文件名,默认与gridfs上的文件名一致

    内部原理

    GridFS是一个建立在普通MongoDB文档基础上的轻量级文件存储规范。其思想是将大文件分成很多块,每块作为一个单独的文档存储,除了存储文件本身的块,还有一个单独的文档用来存储分块的信息和文件的元数据。

    默认情况下,块使用对应数据库(没有指明时是test数据库)的fs.chunks集合。文件的元数据放在fs.files(默认)集合下。

    clip_image006

    clip_image007

    服务器端脚本

    在服务端可以通过db.eval()来执行javascript脚本,也可以将javascript脚本保存在数据库中,然后在别的数据库命令中调用。

    1)db.eval()

    该函数可以在服务端执行任意javascript代码,先将给定的javascript字符串发生给MongoDB,然后返回结果。

    >db.eval("return 1;")

    参数可以通过eval的第二个参数指定,需写成数组的形式。

    >db.eval("function(u){print(’hello,’+u);}",[ "wangdh"])

    2)存储javascript

    每个数据库都有一个特殊的集合,叫做system.js,用来存放javascript变量,这些变量可以在任何MongoDB的javascript上下文中调用。

    >db.system.js.insert({"_id":"username","value":"wangdh"})

    clip_image008

    system.js还可以用来存放javascript代码

    >db.system.js.insert({"_id":"log","value":function(msg,level){

    var levels=["DEBUG","WARN","ERROR","FATAL"];

    level=level?level:0;

    var now=new Date();

    print(now+" "+levels[level]+msg);

    }})

    >db.eval("x=1;log(‘x is ’+x,1)")

  • 相关阅读:
    [置顶] java得到前一个月的年月日时分秒
    Windows 8.1 Preview的新功能和新API
    oracle保证读一致性原理
    10161
    Qt国际化
    使用Maven管理依赖JAR文件,自定义项目布局,利用ANT生成不同的发布包
    Haxe2.10到Haxe3,NME到OpenFL的迁移备忘
    设置RichEdit相关颜色说明
    使用MFC CImage类绘制PNG图片时遇到的问题
    把网球计分招式重构到状态模式
  • 原文地址:https://www.cnblogs.com/Jxwz/p/4188342.html
Copyright © 2011-2022 走看看