这段时间自己打算做一个视频聊天的 app,客户端(iOS),服务器(NodeJS+MongoDB)打算全自己上。后者对我来说零经验,不过老话说的好,生命在于折腾嘛。今天先来说一下在 Mac 下如何搭建 MongoDB 环境。

安装MongoDB

1
2
$ brew update
$ brew install mongodb

喝杯茶的功夫就安装好了。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
==> Downloading https://homebrew.bintray.com/bottles/mongodb-3.0.0.yosemite.bott
######################################################################## 100.0%
==> Pouring mongodb-3.0.0.yosemite.bottle.1.tar.gz
==> Caveats
To have launchd start mongodb at login:
    ln -sfv /usr/local/opt/mongodb/*.plist ~/Library/LaunchAgents
Then to load mongodb now:
    launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mongodb.plist
Or, if you don't want/need launchctl, you can just run:
    mongod --config /usr/local/etc/mongod.conf
==> Summary
🍺  /usr/local/Cellar/mongodb/3.0.0: 17 files, 152M

从打印日志可以看出,mongdb 安装在 /usr/local/Cellar/,版本是 3.0.0,简单看了一下介绍,刚发布不久,性能各种提升。

设置MongoDB数据库位置

接下来要设置数据库存放位置,首先我们要先创建目录,系统默认的路径是 /data/db,不过需要提前手动创建,否则启动 mongodb 会报类似错误:

1
2
$ mkdir -p /data/db
$ mongodb

当然你也可以自己设定数据库存储目录,比如 ~/data/db

1
2
$ mkdir -p ~/data/db
$ mongodb --dbpath ~/data/db

注:如果不提前创建目录,在执行 mongodb --dbpath ~/data/db 时会报类似错误:

1
2
3
4
5
6
7
8
2015-03-20T14:06:42.977+0800 I CONTROL  [initandlisten] options: { storage: { dbPath: "/Users/tianliwei/data/db" } }
2015-03-20T14:06:42.977+0800 I STORAGE  [initandlisten] exception in initAndListen: 10296 
*********************************************************************
 ERROR: dbpath (/Users/tianliwei/data/db) does not exist.
 Create this directory or give existing directory in --dbpath.
 See http://dochub.mongodb.org/core/startingandstoppingmongo
*********************************************************************
, terminating

这样 mongodb 就启动了

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
2015-03-20T14:16:05.630+0800 I CONTROL  [initandlisten] MongoDB starting : pid=86383 port=27017 dbpath=/Users/tianliwei/data/db 64-bit host=tianliweis-iMac.local
2015-03-20T14:16:05.631+0800 I CONTROL  [initandlisten] db version v3.0.0
2015-03-20T14:16:05.631+0800 I CONTROL  [initandlisten] git version: nogitversion
2015-03-20T14:16:05.631+0800 I CONTROL  [initandlisten] build info: Darwin miniyosemite.local 14.1.0 Darwin Kernel Version 14.1.0: Mon Dec 22 23:10:38 PST 2014; root:xnu-2782.10.72~2/RELEASE_X86_64 x86_64 BOOST_LIB_VERSION=1_49
2015-03-20T14:16:05.631+0800 I CONTROL  [initandlisten] allocator: system
2015-03-20T14:16:05.631+0800 I CONTROL  [initandlisten] options: { storage: { dbPath: "/Users/tianliwei/data/db" } }
2015-03-20T14:16:05.642+0800 I JOURNAL  [initandlisten] journal dir=/Users/tianliwei/data/db/journal
2015-03-20T14:16:05.642+0800 I JOURNAL  [initandlisten] recover : no journal files present, no recovery needed
2015-03-20T14:16:05.655+0800 I JOURNAL  [durability] Durability thread started
2015-03-20T14:16:05.655+0800 I JOURNAL  [journal writer] Journal writer thread started
2015-03-20T14:16:05.720+0800 I NETWORK  [initandlisten] waiting for connections on port 27017
2015-03-20T14:30:06.596+0800 I NETWORK  [initandlisten] connection accepted from 127.0.0.1:63987 #1 (1 connection now open)

进入mongodb shell 模式

然后下边就一直空白,处于监听状态,接下来我们另启动应该终端,输入:

1
$ mongodb

然后会进入 mongodb 的 shell:

1
2
3
4
5
6
7
8
9
MongoDB shell version: 3.0.0
connecting to: test
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
	http://docs.mongodb.org/
Questions? Try the support group
	http://groups.google.com/group/mongodb-user
> 

PS:shell会在启动时自动连接MongoDB服务器,所以要确保在使用shell之前启动mongodb,这就是为什么要另开一个终端窗口的原因

接下来就可以进行数据库的各种操作了,shell是功能完备的JavaScript解析器,可以运行任意JavaScript程序,虽然这个功能很酷,但shell真正的威力还在于它是一个独立的MongoDB客户端,开启的时候,shell会连接到MongoDB服务器的test数据库,并将这个数据库连接赋值给全局变量db,这个变量是通过shell访问MongoDB的主要入口点。shell还有些非JavaScript语法扩展,是为了习惯于SQL shell的用户而添加的。例如,选择要使用的数据库:

1
2
> use foobar
switched to db foobar

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

1
2
> db
foobar

mongodb 练习

下面我们来进行一下 mongodb 的练习,如果利用shell进行:创建、读取、更新、和删除(CRUD)。

创建
1
2
3
4
5
6
7
8
> 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("2015-03-20T07:35:32.468Z")
}
> db.blog.insert(post)
WriteResult({ "nInserted" : 1 })
读取
1
2
> db.blog.find()
{ "_id" : ObjectId("550bcdf75039ef1c85e5d6a7"), "title" : "My Blog Post", "content" : "Here's my blog post", "date" : ISODate("2015-03-20T07:35:32.468Z") }
更新
1
2
> db.blog.update({title:"My Blog Post"},post)
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
删除
1
2
> db.blog.remove({title:"My Blog Post"})
WriteResult({ "nRemoved" : 1 })

使用shell的窍门

查看数据库级别的命令帮助

使用 db.help() 可以查看数据库级别的命令帮助

查看函数源码

在输入的时候不要输入括号,这样就会显示该函数的 JavaScript 源代码。比如 db.foo.update

集合名与数据库类的属性同名

如果出现集合名与数据库类的属性同名的情况,例如,要访问 version 这个集合,使用 db.version 就不行,因为 db.version 是个数据库函数。这样会直接打印函数的源码。

1
2
3
4
> db.version
function () {
    return this.serverBuildInfo().version;
}

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

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

还有比如 foo-bar 是个有效的集合名,但在 JavaScript 中就变成变量相减了。通过 db.getCollection(“foo-bar”)就可以得到 foo-bar 集合。

好了,今天就记录这么多吧~

温馨提示: 留言板在科学上网环境下可见