热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MongoDB进阶指南

数据库命令命令的工作原理Drop命令可以在shell中删除一个集合。比如db.coll.drop()。同理也可以用runCommand来达到一样的效果。db.runCommand({drop:coll})命令参考MongoDB支持超过75个命令,我们可以在shell中运行:db.listCommands()或者从驱动程

数据库命令

命令的工作原理

Drop命令可以在shell中删除一个集合。比如db.coll.drop()。同理也可以用runCommand来达到一样的效果。

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

命令参考

MongoDB支持超过75个命令,我们可以在shell中运行:db.listCommands()或者从驱动程序中运行等价的命令list-commands。

浏览器管理员接口:http://localhost:28017/_commands

常用的一些命令,执行用>db.runCommand({"xxx":"xx"}) 执行

buildInfo:管理专用命令,返回MongoDB服务器的版本号和主机等

{"buildinfo":1}

collStats:返回指定集合的统计信息

{"collStats":"coll"}

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

{"distinct":"coll","key":"key","query":"query"}

drop:删除集合的所有数据

{"drop":"coll"}

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

{"dropDatabase":1}

dropIndexes:删除集合里面名称为name的索引,如果名称为*,则代表删除全部。

{"dropIndexes":"coll","index":"name"}

findAndModify 用法在第3章有记录

getLastError:查看对本集合执行的最后一次操作的信息。在w台服务器复制集合的最后操作之前,这个命令会阻塞(超时的毫秒数)

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

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

{"isMaster":1}

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

{"ListCommands":1}

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

{"listDatabases":1}

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

{"ping":1}

renameCollection:将集合a重命名为b,其中a和b都必须是完整的集合命名空间(例如"foo.bar"表示foo数据库中的bar集合)

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

repairDatabase:修复并压缩当前数据库

{"repairDatabase":1}

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

{"serverStatus":1}

创建固定集合

固定集合是一个大小固定的集合,很像环形队列,如果空间不足,最早的文档会被删除,为新的文档腾出空间。

不像普通集合,固定集合需要在使用前显示的创建。使用createCollection命令创建。

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

创建了一个my_coll固定集合,大小100000字节,文档数量上限100个。

我们可以转换已有的普通集合的方式来创建固定集合。使用convertToCapped命令来完成。

>db.runCommand({"convertToCapped":"test",size:100000})

自然排序

固定集合有种特殊的排序方法,是自然排序。自然排序就是文档在磁盘上的顺序。因为固定集合的文档总是按照插入顺序存储的,自然排序就与此相同。

{"$natural":1}排序表示与默认的排序一样,非固定集合用自然排序的意义不大。

如: > db.coll.find().sort({"$natural":1})

尾部游标

尾部游标是一种特殊的持久游标,这类游标会不断的获取最新结果,是受linux中tail -f 命令的启发开发出来的。但是注意mongo shell不支持尾部游标,所以我们看一个php例子:

$cursor = $coll->find()->tailable();

While(true){

If( !$cursor->hasNext() ){

If( $cursor->dead() ){

Break;

}

Sleep(1);

}else{

While( $cursor->hasNext() ){

Do_stuff($cursor->getNext());

}

}

}

GridFS存储文件

开始使用GridFS:mongofiles

Mongofiles内置在MongoDB发布版汇总,可以用来在GridFS中上传,下载,列示,查找或删除文件。像执行其他命令行工具一样,执行mongofiles --help可以查看可用选项。

现在我们向GridFS上传文件,列出文件和下载文件。

$ echo "hello,word" > foo.txt

$ ./mongofiles put foo.txt #上传文件

$ ./mongofiles list #列出文件

$  rm foo.txt #删除本地文件

$ ./mongofiles get foo.txt #下载文件

$ cat foo.txt

$ ./mongofiles search foo.txt #查询文件

$ ./mongofiles delete foo.txt #删除Grid上的文件

内部原理

GridFS的块有个单独的集合,默认情况下,都会使用fs.chunks集合,结构如下:

_id #块的唯一键

n #块编号,也就是这个块在原文件中的编号

data #包含组成文件块的二进制数据

files_id #包含这个块原数据的文件文档 "_id"

文件的原数据都放在另一个集合中,fs.files里面。结构如下:

_id #文件的唯一id,对应files_id

length #文件内容的字节数

chunkSize #每块的大小,以字节为单位,默认是256K

updateDate #文件存入GridFS的时间戳

md5 #文件内容的md5校验和,由服务器端生成

在这里需要提一下md5,它是用于计算上传块的md5校验和,也就意味着用户可以检验md5键的这个值,确保文件正确的上传。

例如:我们可以使用distinct命令获取GridFS中不重复的文件名列表。

>db.fs.files.distinct("filename")

服务器端脚本

db.eval

在服务器端可以使用db.eval函数执行Javascript脚本。这个函数先将给定的Javascript字符串传给MongoDB,然后返回结果。

发送代码有两种选择,或者封装进一个函数,或者不封装。下面代码是等价的。

>db.eval_r("return 1;")

>db.eval_r("function(){return 1;}")

只有传递参数需要封装成一个函数,参数通过db.eval的第二个参数传递,不过要写成一个数据的形式。例如传递给函数username。

>db.eval_r("function(u){print('hello'  u  '!');}",[username])

有必要的话,可以传递多个参数,例如要计算3个数之和。

>db.eval_r("function(x,y,z){return x y z;}",[num1,num2,num3])

存储Javascript

每个MongoDB的数据库中都有个特殊的集合,叫做system.js,用来存放Javascript变量。这些变量可以在任何MongoDB的Javascript上下文中调用,包括$where字句,db.eval调用,MapReduce作业。用insert可以将变量加入到system.js之中。

>db.system.js.insert({"_id":"x","value":1})

System.js还可以存入Javascript代码。如用Javascript写一个日志函数,将其放在system.js中。

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

Var levels = ['debug','warning','error'];

level = level ? level : 0 ;

Var now = new Date();

Print(now   " "   levels[level]   msg );

}})

现在我们可以调用这个函数:

>db.eval_r("x='aaa';log('x is' x,1);");

安全性

为了避免注射漏洞,我们需要限定作用域。在PHP中

$func=new MongoCode("function(){

print('hello,'   username   '!');

}",array("username" => $username))

数据库引用

MongoDB最鲜为人知的功能就是数据库引用,也叫DBRef。DBRef就像Url,唯一确定一个到文档的引用。它加载的方式如同浏览器加载url一样。

DBRef是个内嵌文档,下面有几个是DBRef的必选键,注意必须建的顺序不能改变。

{"$ref":"coll","$id":id_value}

$ref #指定集合

$id #指定文档的 _id

如果想用另外一个数据的文档,还有个$db键

{"$ref":"coll","$id":id_value,"$db":database}

事例模式:

我们使用DBRef跨集合引用文档。本例中含有两个集合users和notes。


推荐阅读
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • Allegro总结:1.防焊层(SolderMask):又称绿油层,PCB非布线层,用于制成丝网印板,将不需要焊接的地方涂上防焊剂.在防焊层上预留的焊盘大小要比实际的焊盘大一些,其差值一般 ... [详细]
  • centos php部署到nginx 404_NodeJS项目部署到阿里云ECS服务器全程详解
    本文转载自:http:www.kovli.com20170919ecs-deploy作者:Kovli本文详细介绍如何部署NodeJS项目到阿里云ECS上, ... [详细]
  • Abp+MongoDb改造默认的审计日志存储位置
    一、背景在实际项目的开发当中,使用AbpZero自带的审计日志功能写入效率比较低。其次审计日志数据量中后期十分庞大,不适合与业务数据存放在一起。所以我们可以重新实现A ... [详细]
  •     系统采用jeeplus框架(ssm+redis+shiro+mongodb+redis),默认是做了JSP未做前后端分离,由于业务需要已经多终端使用的需求(H5、小程序等) ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • Hadoop源码解析1Hadoop工程包架构解析
    1 Hadoop中各工程包依赖简述   Google的核心竞争技术是它的计算平台。Google的大牛们用了下面5篇文章,介绍了它们的计算设施。   GoogleCluster:ht ... [详细]
  • MR程序的几种提交运行模式本地模型运行1在windows的eclipse里面直接运行main方法,就会将job提交给本地执行器localjobrunner执行-- ... [详细]
  • Kylin 单节点安装
    软件环境Hadoop:2.7,3.1(sincev2.5)Hive:0.13-1.2.1HBase:1.1,2.0(sincev2.5)Spark(optional)2.3.0K ... [详细]
  • MongoDB学习:(二)MongoDB简单使用
    MongoDB学习:(二)MongoDB简单使用MongoDB使用:执行mongodb的操作之前,我们需要运行命令,来进入操作命令界面>mongo提示 ... [详细]
  • Zookeeper为分布式环境提供灵活的协调基础架构。ZooKeeper框架支持许多当今最好的工业应用程序。我们将在本章中讨论ZooKeeper的一些最显着的应用。雅虎ZooKee ... [详细]
  • mongoDB高可用集群环境搭建
    2019独角兽企业重金招聘Python工程师标准在生产环境下,部署一台mongodb服务的话,会存在以下问题:单点问题生产环境是一个 ... [详细]
author-avatar
五洋顽石_449
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有