MongoDB——Shell的基本操作及使用窍门

MongoDB自带一个JavaScript shell,可以从命令行与MongoDB实例交互。这个 shell非常有用,通过它可以执行管理操作、检査运行实例,亦或做其他尝试。这个 mongo shell对于使用MongoDB来说是至关重要的工具,本书后面也会经常使用这 个工具。

  • 运行shell

运行mongo启动shell:

$ ./mongo
MongoDB shell version: 1.6.0 url: test
connecting to: test
type "help" for help

shell会在启动时自动连接MongoDB服务器,所以要确保在使用shell之前启动mongodo shell是功能完备的JavaScript解释器,可以运行任何JavaScript程序。为了证明这 一点,我们运行几个简单的数学运算:

>x = 200
200
>x / 5;
40

还可以充分利用JavaScript的标准库。

>Math.sin(Math.PI / 2);
1
>new Date(''2010/l/l");
"Fri Jan 01 2010 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语句是否写完,如没 写完还可以在下一行接着写。

  • MongoDB 客户端

虽然能运行任意JavaScript程序很酷,但shell的真正威力还在于它是一个独立的Mongo- DB客户端。开启的时候,shell会连到MongoDB服务器的test数据库,并将这个数据 库连接赋值给全局变量dbo这个变量是通过sheU访问MongoDB的主要入口点。
shell还有些非JavaScript语法的扩展,是为了方便习惯于SQL shell的用户而添加 的。这些扩展并不提供额外的功能,但它们是很棒的语法糖。例如,最重要的操作 之一就是选择要使用的数据库:

>use foobar
switched to db foobar

现在如果看看db,会发现其指向foobar数据库:

>db
foobar

因为这是一个JavaScript shell,所以键入一个变量会将变量的值转换为字符串(这 里就是数据库名)并打印出来。
可以通过db变量来访问其中的集合。例如db.baz返回当前数据库的baz集合。既然 现在可以在shell中访问集合,那么基本上就可以执行几乎所有的数据库操作了。

  • shell中的基本操作

在shell査看操作数据会用到4个基本操作:创建、读取、更新和删除(CRUD)。

  • 1.创建

insert函数添加一个文档到集合里面。例如,假设要存储一篇博客文章。首先, 创建一个局部变量post,内容是代表文档的JavaScript对象。里面会有"title", “content"和"date”(发表日期)几个键。

>post = ( nti11 e11 : "My Blog Post11,
..."content" : "Here's my blog post.",
...ndate11 : new Date () }
(
"title" : "My Blog Post",
"content" : "Here * s my blog post.H,
"date" : "Sat Dec 12 2009 11:23:21 GMT-0500 (EST)"
}

这个对象是个有效的MongoDB文档,所以可以用insert方法将其保存到blog集 合中:

>db ..blog. insert (post)

这篇文章已经被存到数据库里面了。可以调用集合的find方法来査看一下:

>db.blog.find()
(
: Objectld(,,4b2 3c3ca752 5f35f94b6 0a2d"),
: "My Blog Post",
"content" : "Here 1s my blog post.",
"date" : "Sat Dec 12 2009 11:23:21 GMT-0500 (EST)"
}

除了我们输入的键/值对都完整地被保存下来,还有一个额外添加的键»_id"o本 章的最后会解释"_id"突然出现的原因。

  • 2.读取

find会返回集合里面所有的文档。若只是想査看一个文档,可以用findOne:

>db.blog.findOne()
{
	"_id" : Objectld( ''4b2 3c3ca7525f3 5f94b60a2d»),
	"title11 : "My Blog Post",
	"content” : "Here's my blog post.",
	"date" : "Sat Dec 12 2009 11:23:21 GMT-0500 (EST)"
}

find和f indOne可以接受査询文档形式的限定条件。这将通过査询限制匹配的文 档。使用find时,shell自动显示最多20个匹配的文档,但可以获取更多文档。

  • 3.更新

如果要更改博客文章,就要用到update To update接受(至少)两个参数:第一 个是要更新文档的限定条件,第二个是新的文档。假设决定给我们先前写的文章增 加评论内容,则需要增加一个新的键,对应的值是存放评论的数组。
第一步修改变量post,增加"comments"键:

>post.comments = []
[]

然后执行update操作,用新版本的文档替换标题为aMy Blog Post"的文章:

>db.blog.update((title : "My Blog Post"}, post)

文档已经有了”comments”键。再用find査看一下,可以看到新的键:

>db.blog.find()
{
	"_id": ObjectId(M4b23c3ca7525f35f94b60a2dn),
	"title" : "My Blog Post"t
	"content" : MHere's my blog post.",
	"date" : "Sat Dec 12 2009 11:23:21 GMT-0500 (EST)",
	"comments":[]
}
  • 4.删除

remove用来从数据库中永久性地删除文档。在不使用参数进行调用的情况下,它 会删除一个集合内的所有文档。它也可以接受一个文档以指定限定条件。例如,下 面的命令会删除我们刚刚创建的文章:

>db.blog.remove((title : "My Blog Post"})

集合现在又是空的了。

  • 使用shell的窍门

由于mongo是个JavaScript shell,通过在线査看JavaScript的文档能获得很多帮助。 shell本身内置了帮助文档,可以通过help命令査看。

>help
HELP
show dbs	show database names
show collections in current database
show users in current database
show recent system.profile entries w. time >= Iras set current database to <db name>
help on DB methods
help on collection methods	.
list objects in collection foo
list objects in foo where a == 1
result of the last line evaluated

使用db.help ()可以査看数据库级别的命令的帮助,集合的相关帮助可以通过db. foo. help ()来査看。
有个了解函数功用的技巧,就是在输入的时候不要输括号。这样就会显示该函数的 JavaScript源代码。例如,如果想看看update的机理,或者就是为了看看参数顺 序,可以这么做:

> db.foo.update function (query, obj, upsert, multi) {
	assert(query, Mneed a query");
	assert(obj, Hneed an obj ect"); 
	this._validateObject(obj); 
	this._mongo.update(this._fullName, query, obj, upsert ? true : false, multi ? true : false);
}

要査看shell提供的所有自动生成的JavaScript函数API文档,可访问http://api.mon- godb.org/jso
蹩脚的集合名
使用db.集合名的方式来访问集合一般不会有问题,但如果集合名恰好是数据库类 的一个属性就有问题了。例如,要访问version这个集合,使用db. vers ion就 不行,因为db.version是个数据库函数(它返回正在运行的MongoDB服务器的 版本)。

>db.version
function (){
	return this.serverBuildlnfo().version;
}

当JavaScript只有在db中找不到指定的属性时,才会将其作为集合返回。当有属性 与目标集合同名时,可以使用getCollection函数:

>db.getCollection("version");
test.version

要査看名称中含有无效JavaScript字符的集合,这个函数也可以派上用场。比如£。。-
bar是个有效的集合名,但是在JavaScript中就变成了变量相减了。通过db.get- Collection ( " f oo-bax")可以得到 f oo-bax 集合。
在JavaScript中,x.y与x[‘y’]完全等价。这就意味着不但可以直“呼”其名,也可 以使用变量来访问子集合。也就是说,当需要对blog的每个子集合执行操作时,只需 要像下面这样迭代就好了:

var collections = ["posts" z "comments**, "authors"]for (i in collections) (
doStuff(db.blog [collections[i]]);
}

而不是使用下面这种笨笨的写法:

doStuff(db.blog.posts);
doStuff(db.blog.comments);
doStuff(db.blog.authors);

你可能感兴趣的:(后台编程)