2.5 MongoDB shell简介
MongoDB自带JavaScript shell,可在shell中使用命令行与MongoDB实例交互。shell非常有用,通过它可以执行管理操作,检查运行实例,亦或做其他尝试。对MongoDB来说,mongo shell是至关重要的工具,其应用之广泛将体现在本书接下来的部分中。
2.5.1 运行shell
运行mongo启动shell:
$ mongo MongoDB shell version: 2.4.0 connecting to: test >
启动时,shell将自动连接MongoDB服务器,须确保mongod已启动。
shell是一个功能完备的JavaScript解释器,可运行任意JavaScript程序。为说明这一点,我们运行几个简单的数学运算:
> x=200 200 > x / 5; 40
另外,可充分利用JavaScript的标准库:
> Math.sin(Math.PI / 2); 1 > new Date("2010/1/1"); "Fri Jan 012010 00:00:00 GMT-0500 (EST)" > "Hello, World! ".replace("World", "MongoDB"); Hello, MongoDB!
再者,可定义和调用JavaScript函数:
> function factorial (n) { ... if (n <=1) return 1; ... return n * factorial(n -1); ... } > factorial(5); 120
需要注意,可使用多行命令。shell会检测输入的JavaScript语句是否完整,如没写完可在下一行接着写。在某行连续三次按下回车键可取消未输入完成的命令,并退回到>-提示符。
2.5.2 MongoDB客户端
能运行任意JavaScript程序听上去很酷,不过shell的真正强大之处在于,它是一个独立的MongoDB客户端。启动时,shell会连到MongoDB服务器的test数据库,并将数据库连接赋值给全局变量db。这个变量是通过shell访问MongoDB的主要入口点。
如果想要查看db当前指向哪个数据库,可以使用db命令:
> db test
为了方便习惯使用SQL shell的用户,shell还包含一些非JavaScript语法的扩展。这些扩展并不提供额外的功能,而是一些非常棒的语法糖。例如,最重要的操作之一为选择数据库:
> use foobar switched to db foobar
现在,如果查看db变量,会发现其正指向foobar数据库:
> db foobar
因为这是一个JavaScript shell,所以键入一个变量会将此变量的值转换为字符串(即数据库名)并打印出来。
通过db变量,可访问其中的集合。例如,通过db.baz可返回当前数据库的baz集合。因为通过shell可访问集合,这意味着,几乎所有数据库操作都可以通过shell完成。
2.5.3 shell中的基本操作
在shell中查看或操作数据会用到4个基本操作:创建、读取、更新和删除(即通常所说的CRUD操作)。
1.创建
insert函数可将一个文档添加到集合中。举一个存储博客文章的例子。首先,创建一个名为post的局部变量,这是一个JavaScript对象,用于表示我们的文档。它会有几个键:"title"、"content"和"date"(发布日期)。
> post={"title" : "My Blog Post", ... "content" : "Here's my blog post.", ... "date" : new Date()} { "title" : "My Blog Post", "content" : "Here's my blog post.", "date" : ISODate("2012-08-24T21:12:09.982Z") }
这个对象是个有效的MongoDB文档,所以可以用insert方法将其保存到blog集合中:
> db.blog.insert(post)
这篇文章已被存到数据库中。要查看它可用调用集合的find方法:
> db.blog.find() { "_id" : ObjectId("5037ee4a1084eb3ffeef7228"), "title" : "My Blog Post", "content" : "Here's my blog post.",
"date" : ISODate("2012-08-24T21:12:09.982Z") }
可以看到,我们曾输入的键/值对都已被完整地记录。此外,还有一个额外添加的键"_id"。"_id"突然出现的原因将在本章末尾解释。
2.读取
find和findOne方法可以用于查询集合里的文档。若只想查看一个文档,可用findOne:
> db.blog.findOne() { "_id" : ObjectId("5037ee4a1084eb3ffeef7228"), "title" : "My Blog Post", "content" : "Here's my blog post.", "date" : ISODate("2012-08-24T21:12:09.982Z") }
find和findOne可以接受一个查询文档作为限定条件。这样就可以查询符合一定条件的文档。使用find时,shell会自动显示最多20个匹配的文档,也可获取更多文档。第4章会详细介绍查询相关的内容。
3.更新
使用update修改博客文章。update接受(至少)两个参数:第一个是限定条件(用于匹配待更新的文档),第二个是新的文档。假设我们要为先前写的文章增加评论功能,就需要增加一个新的键,用于保存评论数组。
首先,修改变量post,增加"comments"键:
> post.comments=[] [ ]
然后执行update操作,用新版本的文档替换标题为“My Blog Post”的文章:
> db.blog.update({title : "My Blog Post"}, post)
现在,文档已经有了"comments"键。再用find查看一下,可以看到新的键:
> db.blog.find() { "_id" : ObjectId("5037ee4a1084eb3ffeef7228"), "title" : "My Blog Post", "content" : "Here's my blog post.", "date" : ISODate("2012-08-24T21:12:09.982Z"), "comments" : [ ] }
4.删除
使用remove方法可将文档从数据库中永久删除。如果没有使用任何参数,它会将集合内的所有文档全部删除。它可以接受一个作为限定条件的文档作为参数。例如,下面的命令会删除刚刚创建的文章:
> db.blog.remove({title : "My Blog Post"})
现在,集合又是空的了。