前言
在前一章文章中提到了Mongodb提供了一个Javascript运行环境,这个运行环境我们通过mongo
或者mongo.exe
打开,这是一个独立的Mongodb客户端,打开它后会自动连接上本地端口为27017的数据库。
如果你需要远程连接到其他数据库或者通过另外端口进行连接,可以通过--host xxxx
来设置远程数据库的地址和通过--port
来改变默认连接端口。
运行mongod
打开mongo
后会默认连接到test
数据库,就像下图:
在这个环境中我们可以使用Javascript的语法、原生方法、还可以编写函数来处理数据库,除此之外,这个Shell环境中还提供了Mongodb的一些操作语法,比如db
,show dbs
,show collections
,insert
等。下图显示了在Shell环境中运行Javascript代码以及一些常用的原生方法。
需要注意Shell会检查Javascript代码是否完整,如果没有写完可以在下一行继续写,但是如果在写代码的过程中发现出现了问题需要取消,按三次回车键就可以取消当前语句执行。比如下图中我定义了一个变量c,但是没有赋值,我连续按三次回车键取消当前语句执行,当我再次使用变量c
的时候提示c is not defined
。
简单的语句
在使用Shell环境的时候会用到几个简单的语句,其他的语句后面会慢慢的讲解。
db
: db是一个全局变量,记录着当前所在的数据库名
show dbs
: 列出当前连接的所有数据库名
use xxx
: use语句后面跟一个数据库名称,可以改变当前所在的数据库
show collections
: 显示当前数据库中所有的集合
这里需要注意的是db
变量是一个对象,里面包含这个数据库的信息,当我们直接输入db
的时候,实际上返回的是db._name
这个属性的值,而这个属性是保存着当前数据库名,下图是返回一个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 Shell》留言数:0