Mongodb Shell

前言

前一章文章中提到了Mongodb提供了一个Javascript运行环境,这个运行环境我们通过mongo或者mongo.exe打开,这是一个独立的Mongodb客户端,打开它后会自动连接上本地端口为27017的数据库。

如果你需要远程连接到其他数据库或者通过另外端口进行连接,可以通过--host xxxx来设置远程数据库的地址和通过--port来改变默认连接端口。

运行mongod

打开mongo后会默认连接到test数据库,就像下图:

默认test

在这个环境中我们可以使用Javascript的语法、原生方法、还可以编写函数来处理数据库,除此之外,这个Shell环境中还提供了Mongodb的一些操作语法,比如db,show dbs,show collections,insert等。下图显示了在Shell环境中运行Javascript代码以及一些常用的原生方法。

运行Js代码

需要注意Shell会检查Javascript代码是否完整,如果没有写完可以在下一行继续写,但是如果在写代码的过程中发现出现了问题需要取消,按三次回车键就可以取消当前语句执行。比如下图中我定义了一个变量c,但是没有赋值,我连续按三次回车键取消当前语句执行,当我再次使用变量c的时候提示c is not defined

取消代码执行

简单的语句

在使用Shell环境的时候会用到几个简单的语句,其他的语句后面会慢慢的讲解。

db: db是一个全局变量,记录着当前所在的数据库名
show dbs: 列出当前连接的所有数据库名
use xxx: use语句后面跟一个数据库名称,可以改变当前所在的数据库
show collections: 显示当前数据库中所有的集合

这里需要注意的是db变量是一个对象,里面包含这个数据库的信息,当我们直接输入db的时候,实际上返回的是db._name这个属性的值,而这个属性是保存着当前数据库名,下图是返回一个db变量的遍历信息:

db遍历信息

在Javascript中我们可以通过以下方式来获取对象的属性:

var a = {
    b: 2
}

a.b;

那既然Shell是Mongodb提供的一个Javascript Shell,那么我们同样可以用这样的方式来访问集合,比如像下面这样

db.test

基本操作

上面一个章节说了可以通过.符号来访问对象的属性,那么通过这样的方式访问集合,而返回的同样是一个对象,这个对象本身包含了一些当前集合的信息,我们可以通过Obejct.getOwnPropertyNames(db.test)来遍历自身的属性名:

遍历

db对象和返回的集合对象继承了很多Mongodb提供的方法,我们可以通过db.help()db.test.help()方法来查看可以使用的一些数据库操作方法。

insert方法

Mongodb给集合返回的对象提供了insert方法,以便给当前集合插入数据,insert接受一个对象作为参数。

db.test.insert({ a:1, b:2 });
find方法

Mongodb给集合返回的对象提供了find方法,以便对于当前集合进行搜索文档,find接受一个对象作为参数,这个对象包含你要查询的条件。

db.test.find({a:1}); //查询所有文档含有键值为a:1的文档,并返回符合的所有文档

db.test.find({a.b:1}); //查询所有文档含有子健b的a键并且值等于1,并返回符合的所有文档

db.test.findOne({a:1}); //查询所有文档含有键值为a:1的文档,并返回符合的第一个文档
update方法

Mongodb给集合返回的对象提供了update方法,用于更新(修改)符合查询条件的文档,update接受两个参数,第一个是查询需要更新文档的条件,第二个参数是需要更新的内容。

db.test.update({a: 1}, {a: 2}); //查询所有文档中键值为a:1的文档,并修改为为a:2
remove方法

Mongodb给集合返回的对象提供了remove方法,用于删除符合查询条件的文档。接受一个参数,这个参数为一个参数条件

db.test.remove({a:1}); //查询所有文档中含有键值为a:1的文档,并删除

执行脚本

前言

Mongodb执行外部JS文件首先会查找JS文件,如果没有指定一个绝对路径的JS文件,那么它会查找shell的执行目录。

使用mongo执行外部js

Mongodb提供了一个执行外部JS文件的方式,在这个方式中所有的方法语句全部按照js来执行,比如mongo环境中执行的几个语句被替换为:

  • use test 替换为 db.getSisterDb('test')
  • show dbs 替换为 db.getMongo().getDBs()
  • show collections 替换为 db.getCollectionNames()
  • 在外面JS文件中使用connect('localhost:27017/test')来创建一个数据库连接,并返回db对象
  • 获取一个集合的对象可以使用db.a操作符或者使用db[a]数组访问语法,或者使用db.getCollection('a')都可以达到相同的效果

大概使用方法像下面这样:

mongo 1.js;

JS文件内部如果想要打印数据,需要使用标准的输出库来输出内容print()。既然能从标准库输出内容,那么我们也就能通过管道命令来继续我们的操作,比如数据备份是一个js文件,而打包是一个js文件,这样就很符合前端的模块化不是吗?管道操作通过参数--quiet

我们经常会遇见在本地写好执行文件,然后到服务器上执行,比如说备份,但是Mongodb提供了一个非常好用的端口,可以直接指定远程端服务器的地址端口然后执行本地JS文件。使用方式是大概如下:

mongo wuyizhou.com:28011/blog backup.js
在Javascript Shell环境中执行外部js

Mongodb在Shell环境中提供了load()方法来在环境中加载外部JS文件,并且JS的代码作用于当前的shell环境中,也就是说我们外面JS文件声明了一个函数a,那么执行完后,在当前的shell环境中这个函数a是存在的。这样我们就很方便的可以把我们定义的一些方法函数加载进来。下面的代码在Shell环境中。

load('1.js');

创建.mongorc.js文件

这个文件的作用是在Shell启动的时候自动加载一些设置配置,这样我们就可以在这个文件当中编写一些我们常用的方法、函数。

当然这个文件还有一个用处就是可以重写一些危险的方法,这样就避免的程序的误操作等问题。比如下面删除数据库的一个方法。

.mongorc.js

db.dropDatabase = function(){
    print('不能使用此操作!');
}

通过上面的方法,每次使用db.dropDatabase操作的时候就会输出不能使用此操作!的内容。

修改默认的编辑器

在Shell中可以设置EDITOR变量修改默认的编辑器,然后使用edit命令后面跟相应的文档来编辑,比如下面这样:

EDITOR="/usr/bin/vim";

var a = db.test.find({a: 1});

edit a;

当然你可以把这个变量写在.mongorc.js文件中,让每次加载shell的时候就自动更改默认编辑器

关闭Javascript执行

如果需要完全关闭Javascript的执行功能只需要在启动mongodb的时候加上一个参数就可以了,这个参数为--noscripting

参考

MongoDB权威指南(第2版)

文完

文档信息

发表评论

电子邮件地址不会被公开。 必填项已用*标注