# 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并沒有表的概念,取而代之的是集合。熟悉關系型數據庫的朋友可以直接把集合理解成表