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:\MongoDB\dbData\UploadTest.txt

>mongofiles list

>mongofiles get E:\MongoDB\dbData\UploadTest.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)")

转载于:https://www.cnblogs.com/Jxwz/p/4188342.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/492669.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

visual assist安装方法

参考:https://blog.csdn.net/yychentracy/article/details/82809888

汽车与智能家居互联时代 语音控制很关键

来源: I CTA编译:网易智能 nariiy摘要:对于大多数人而言,最昂贵的两个物件是家和汽车。如今,技术将这二者联系在一起,并互为延伸。在不断加速发展的趋势中,智能家居和联网汽车正在融合&#xff…

[问题解决]同时显示多个Notification时PendingIntent的Intent被覆盖?

情况是这样的,使用NotificationManager触发多个Notification: Java代码 private Notification genreNotification(Context context, int icon, String tickerText, String title, String content, Intent intent){ Notification notification new Notifi…

QT中的QButtonGroup

QButtonGroup类可以实现同一组的按钮的互斥操作, 比如当点击到某一个按钮checked时,其他按钮恢复到默认状态, 具体见 https://blog.csdn.net/naibozhuan3744/article/details/82146755 和:https://www.cnblogs.com/ranson7zop/p/…

【工业革命】第四次工业革命:自主经济的崛起

来源:产业智能官摘要:数据是新的资源,数据的处理和应用将带动第四次工业革命。随着大数据、云计算、物联网、人工智能、区块链等技术的崛起,很多人都说第四次工业革命即将到来。第四次工业革命到底指的是什么?应该如何…

mysql分表方法实现

一般来说,当我们的数据库的数据超过了100w记录的时候就应该考虑分表或者分区了,这次我来详细说说分表的一些方法。目前我所知道的方法都是MYISAM的,INNODB如何做分表并且保留事务和外键,我还不是很了解。 首 先,我们需…

QT中的QGridLayout布局

QGridLayout布局参考: https://blog.csdn.net/mynameislinduan/article/details/77893298

2019年大数据发展将走向何方

来源:网络大数据近日,包括CCF(中国计算机学会)大数据专家委员会、IDC公司(Internet Data Center 互联网数据中心)和Gartner公司等多家国内外知名信息技术研究机构均发布报告,对2019年乃至未来若干年的大数据产业发展趋势做出预测,…

iOS定时器

相关类:NSTimer A timer is not a real-time mechanism; it fires only when one of the run loop modes to which the timer has been added is running and able to check if the timer’s firing time has passed. Because of the various input sources a typical run loop…

QT给文本添加链接事件

参考自: https://blog.csdn.net/humanking7/article/details/80685893 说明 Qt的文本窗体部件能够显示富文本,使用HTML4 标记。能够以这种方式显示富文本的窗体控件有: QTextDocument, 以及 QLabel and QTextEdit。 关于打开超链接的两种方…

AI人必看!89页全网最全清华知识图谱报告

来源:智东西摘要:谷歌冲锋,淘宝猛追,这个AI秘密武器强在哪?知识图谱(Knowledge Graph)是人工智能的重要分支技术,它在2012年由谷歌提出,成为建立大规模知识的杀手锏应用&…

自学php【二】 PHP计算时间加一天

最近几天在做一个项目,主要是将SQLserver数据到MySQL数据库,一个url跑一次 同步一次昨天的数据,由于很多数据需要同步,所以做了一个操作界面的,一个单纯跑url的 在其中涉及到了对于时间的计算!当我写完这个…

为QT添加qss样式文件

代码 QFile file("my.qss"); file.open(QFile::ReadOnly); QString styleSh tr(file.readAll()); setStyleSheet(styleSh);my.qss文件内容 /* 正常时,按钮颜色 */ QPushButton{background-color:rgb(240,255,255);color: rgb(0, 0, 2);border-style: o…

人机融合智能的现状与展望

来源:人机与认知实验室作者:刘伟 苌凯旋摘要:本文对人机融合智能的概念、应用、发展将面临的关键问题以及未来发展的方向进行简要介绍。1 引言1.1 现有人工智能的不足与挑战人工智能(AI)的概念于1956年的达特蒙斯学院暑…

J2EE软件开发视频教程

BF-TECH-J2EE软件开发工程师就业班课程 课时数量:920课时 用到技术:J2EE 涉及项目:权限管理通用模块、易买网、CRM客户关系管理系统等 咨询qq:1840215592 J2EE软件工程师培训视频教程结合项目,进行实战图书馆信息管理系…

优先队列priority_queue的使用方式

C STL中的一种数据存储结构&#xff0c;数组的方式存储&#xff0c;插入数据时&#xff0c;设置排序规则&#xff0c;可以自动排序&#xff0c; priority_queue <int,vector<int>,less<int> > p; priority_queue <int,vector<int>,greater<int&…

Unity自带网络功能——NetworkView组件、Serialize、RPC

Unity拥有大量的第三方插件&#xff0c;专门提供了对网络功能的支持。可是&#xff0c;大部分开发人员第一次接触到的还是Unity自带的网络功能&#xff0c;也就是大家常常说到的Unity Networking API。这些API是借助于组件NetworkView发挥作用的&#xff0c;而它能够简化开发人…

Science:人工智能的发展离不开神经科学,先天结构或是下一个方向

来源&#xff1a;Science编译&#xff1a;机器之心摘要&#xff1a;人工智能从神经科学领域吸收了大量养分&#xff0c;并由此催生了深度学习和强化学习等智能处理方法。以色列魏茨曼科学研究学院计算机科学系教授 Shimon Ullman 相信神经科学还能为人工智能发展提供进一步的助…

Ubuntu20.04 及深度学习环境anaconda、cuda、cudnn、pytorch、paddle2.3安装记录

学习目标&#xff1a; Ubuntu20.04下装好torch、paddle深度学习环境。 选择的版本环境是 &#xff1a;最新的nvidia驱动、cuda 11.1 、cudnn v8.1.1&#xff0c;下面会说为啥这么选。 学习内容&#xff1a; 1. Ubuntu20.04仓库换源 本节参考Ubuntu 20.04 Linux更换源教程 2…

NSIS脚本语言安装与编译

NSIS是什么 当项目中需要把安装包发给客户时&#xff0c;不能直接发送release文件&#xff0c;需要把release文件压缩打包&#xff0c;这时就可以用到NSIS工具&#xff0c;NSIS工具可以进行包装&#xff0c;使用时需要下载&#xff1a; 编译环境&#xff1a;nullsoft scriptab…