MongoDB权威指南(第2版)
上QQ阅读APP看书,第一时间看更新

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"})

现在,集合又是空的了。