MongoDB自带一个JavaScript Shell。可以通过这个Shell与启动的MongoDB实例进行交互,进行交互的语言就是JavaScript (
对于接触过Web前台开发的童鞋,这个真是一个惊喜啊!)。在Windows下先启动MongoDB服务,然后运行mongo命令即可打开Shell:
Shell启动默认会连接到MongoDB的test数据库。你可以对这个数据库中的集合和文档进行操作。刚才说了MongoDB Shell是一个完备的JavaScript解释器,可以运行任何JavaScript程序,我们就写几个实验一下吧,顺便回忆一下JavaScript的基本语法了:
在Shell中,每当你写完一句完整的JavaScript代码,Shell就会将其结果返回。从中我们还可以定义函数,在定义函数时,Shell检测函数没有定义完,换行时,会提示让你继续输入。定义好函数后,我们可以直接调用。
Shell除了是一个很酷的JavaScript解释器外,其存在的真正目的是一个MondoDB的客户端。启动Shell,其默认连接到test数据库,并将这个数据库连接赋值给全局变量db。这个变量使我们通过Shell访问MongoDB的主要入口点。
Shell同时提供了一些非JavaScript的操作,最常用的是选择使用的数据库:
使用use 数据库名就可以切换全局变量db当前指向的数据库。注意:use操作同时可以创建数据库,如果use+一个不存在的数据库名,则use执行后,MongoDB会创建对应数据库。现在看看在Shell中对数据库执行CRUD操作。
【C:创建】
利用insert命令可以往一个集合中插入文档。看下面的图,我先通过use命令创建并将db指向了mylearndb, 然后通过insert 向 mylearndb.blog集合中插入文档,该集合第一次使用会被创建:插入后,可通过集合的find命令来查询显示:
集合的find命令默认查询并返回集合中所有的文档,Shell会自动展示20个,我们再插入一个文档并查询出来:
从上图可以看出,我们定义的文档并没有“_id” 这个键,但插入到集合后,系统会自动添加这个键,并生成一个集合内唯一的值。
【R:读取】
上述集合的find就是一个读取命令,如果只想查询出一条,可以通过集合的findOne命令。find和findOne均可以接受查询文档形式的限定条件。看如下例子:
第一次调用findOne,我们没有加查询条件,得到集合中第一条数据,第二次查询,我们传递了一个文档类型的参数,并指明了键“title”的值,我们就查询到了这个键对应这个值的文档了。
【U:更新】
如果要更改文档,我们要用到update命令,该命令接受(至少)两个参数,第一个是要更新的文档的限定条件,第二个是新的文档。通常我们的做法是,先通过find或findOne命令得到对应的文档,然后进行更新,最后通过update命令将新的文档更新到集合中,图示:
图示我们先获得第一次插入的博客文档,然后向其中添加了一个新的键,值为数组类型,存放评论。然后将这个文档更新到数据库中。
【D:删除】
集合的remove方法用于永久性删除一个集合中的文档,默认不接受参数的情况下,他会删除集合中所有文档,也可以接受一个参数删除特定的文档:
这段操作,首先查询所有文档,然后通过集合的remove操作删除一条,最后调用集合的find命令确认文档永久删除。
Shell使用也有一些技巧,在Shell中运行help可以得到一些函数的帮助介绍。运行db.help() 可以得到所有数据库支持的函数。运行db.mylearndb.help() 可以得到所有集合支持的函数。
在Shell中如果想查看函数的源码也十分方便,在函数名称后面别添加“()”即可,如db.help()是调用数据库的help函数。但如果直接执行db.help就是查看数据库的help函数源码了。
通常来说,db.集合名,就可以得到对应的集合。但如果该名称是数据库对象的一个属性,这样做就没法返回这个集合了。如db.version ,其会返回当前正在运行的MongDB服务的版本号。如果你有一个verison的集合,这样你无法得到这个集合对象。这是你可以通过数据库的getCollection函数即db.getCollection("version")得到这个集合对象。如果集合名称中有一些无效的JavaScript字符,要得到这个集合,也需要通过getCollection函数。如foo-bar这个集合名称,直接写db.foo-bar,Shell会执行失败,因为“-”会被当成减法运算符处理。要获得这个集合,我们必须这样做db.getCollection("foo-bar"),如图:
另外,再提一点,JavaScript中,x.y 和 x['y']完全等价,上一篇中我们提过子集合的表示,是通过“.“连接的,因此我们也可以通过后者这种方式对来引用子集合:
// 通过数组放置所有子集合的名称
var collections = ["posts", "comments", "authors"];
for(i in collections){
// 对子集合执行doStuff函数
doStuff(db.blog[collections[i]]);
}
这样我们可以通过循环的方式来操作一组集合,而不必逐个调用,对于大量集合的情况,我们通过某个方法得到所有集合的数组,然后一个for就可以,而不用这样操作:
doStuff(db.blog.posts);
doStuff(db.blog.comments);
doStuff(db.blog.authors);