# Hello,MongoDB
***
MongoDB 是文档型数据库,mongo 来自于英文单词“Humongous”,中文含义为“庞大”。
MongoDB 更像是一个介于关系型数据库和非关系型数据库之间的数据库。是非关系型数据库中支持功能最多的,最接近关系型数据库。同时存储数据的格式是类似 json 的 bson 格式。因此可以存储结构更复杂的数据。
充分的利用了内存使 MongoDB 拥有比关系型的数据库更好的读写性能,支持索引,聚合。对分布式高度支持,并且可以使用廉价的硬件设施来运行数据库。所以 MongoDB 非常适合初期需求变动频繁的创业团队,加快产品上市时间,降低企业成本。
## 1. 安装配置 MongoDB
除了可以按照文中搭建虚拟机或VPS安装 Redis 外,也推荐你直接使用[新浪云](http://t.cn/RbsUCkH)来部署环境,更方便快捷,注册账号赠送的云豆足够免费使用到学习完整本书的内容。
### 1.1 第一次安装
先使用 curl 下载 MongoDB 安装包,解压缩之后放到`/usr/local`目录下
~~~
curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-amazon-3.4.5.tgz
tar -zxvf mongodb-linux-x86_64-amazon-3.4.5.tgz
mv mongodb-linux-x86_64-amazon-3.4.5/ /usr/local/mongodb
~~~
### 1.2 加入环境变量中
~~~
export PATH=/usr/local/mongodb/bin:$PATH
~~~
### 1.3 创建数据库目录
MongoDB 默认的数据存储目录是`/data/db`,需要手动创建
~~~
mkdir -p /data/db
~~~
如果你不想把 MongoDB 的数据存储在`/data/db`文件夹下,可以在启动 MongoDB 的时候通过`--dbpath`参数来指定。
### 1.4 启动 MongoDB 服务
~~~
$ > mongod
# 指定数据存储目录
$ > mongod --dbpath=/home/db
~~~
### 1.5 管理 Mongodb
~~~
$ > mongo
~~~
执行 mongo 命令文件启动 MongoDB Shell,MongoDB Shell 是 MongoDB 自带的交互式 Shell,是 JavaScript Shell,支持一些 JavaScript 的语法和算术运算。
也可以在启动 MongoDB 服务的时候增加参数`--rest` 来启用 web 图形界面来管理 MongoDB。默认的 MongoDB 的默认端口是 27017。默认的 web 图形界面的访问端口是默认端口加1000,即 28017。访问地址就是`http://ip:28017`。
> 在生产环境中并不推荐使用 web 图形界面来维护数据
## 2. MongoDB 和 ThinkPHP5 的第一次相遇
在通过 PHP 来使用 MongoDB 之前需要先安装 PECL 拓展。
目前,MongoDB 在 PHP 有两个拓展,分别是`mongo` 和 `mongodb`
1. `mongo` 拓展仅支持php5.3-5.6之间版本,并且目前已经停止更新
~~~
http://pecl.php.net/package/mongo
~~~
2. `mongodb`拓展支持php5.4-php7.x之间版本,推荐使用这个拓展
~~~
http://pecl.php.net/package/mongodb
~~~
> ThinkPHP5 使用的是`mongodb`拓展,想要使用ThinkPHP5 官方 MongoDB 驱动必须要安装`mongodb`拓展
使用pecl 命令来安装 mongodb 拓展
~~~
$ > pecl install mongodb
~~~
通过`php --ri`来确认拓展是否安装成功
~~~
$ > php --ri mongodb
~~~
ThinkPHP5 官方提供了 MongoDB 驱动,可以直接通过 Composer 安装。
~~~
composer require topthink/think-mongo
~~~
修改配置文件(application/database.php)
将type属性修改为`mongodb`即可
~~~
'type' => '\think\mongo\Connection',
~~~
然后就可以使用 ThinkPHP5 的 Db 方法或者模型来使用 MongoDB 数据库了
~~~
<?php
$arr = Db::table('test_db')->select();
halt($arr);
~~~
> MongoDB并没有表的概念,取而代之的是集合。熟悉关系型数据库的朋友可以直接把集合理解成表