Mongodb學習記錄:入門(一)
來自專欄 鏡心的小書屋
預熱看我之前的文章[Node學習記錄: mongodb](Node學習記錄: mongodb)
這個系列旨在系統的學習`Mongodb`
# 學習目標
![圖片描述][1]
![圖片描述][2]
![圖片描述][3]
![圖片描述][4]
> MongoDB官網:MongoDB for GIANT Ideas
> MongoDB中文社區:MongoDB中文社區 | 中文社區
> mongodb github:mongodb
# 關係型資料庫 與 非關係型資料庫
> `MongoDB`是一個面向文檔(document-oriented)的資料庫,而不是關係型資料庫。不採用關
> 系模型主要是為了獲得`更好的擴展性`。當然, 還有其他一些好處。
![圖片描述][5]
>
> 與關係型資料庫相比,面向文檔的資料庫不再有`行`(`row`)的概念,取而代之的是更為靈活的`文檔`(`document`)模型。通過在文檔中嵌入文檔和數組,面向文檔的方法能夠僅使用一條記錄來表現複雜的層次關係,這與使用現代面向對象語言的開發者對數據的看法一致。
> 另外,不再有預定義模式(`predefined schema`):文檔的鍵(`key`)和值(`value`)不再是固定的類型和大小。由於沒有固定的模式,根據需要添加或刪除欄位變得更容易了。通常,由於開發 者能夠進行快速迭代,所以開發進程得得以加快。而且,實驗更容易進行。開發者能嘗試大量的數據模型,從中選擇一個最好的。
> MongoDB並不具備一些在關係型資料庫中很普遍的功能,如連接(`join`)和複雜的多行事務(`multirow transaction`)。省略這些功能是出於架構上的考慮(為了得到更好的擴展性),因為在`分散式系統`中這兩個功能難以高效地實現。
#基礎概念
- `文檔`是MongoDB中數據的基本單元,非常類似於關係型資料庫管理系統中的`行`,但更具表現力
- 集合(`collection`)可以看作是一個擁有動態模式(dynamic schema)的表
- MongoDB的一個實例可以擁有多個互相獨立的資料庫(database),每個資料庫都擁有自己的集合
- 每個文檔都有一個特殊的鍵"_id",這個鍵在文檔所屬的集合中唯一的。
- MongoDB自帶一個簡單但功能強大的`JavaScript shell`可用於管理MongDB的實例 或 數據操作
## 文檔
- 文檔就是鍵值對的一個`有序集`
`{"x" : 1, "y":2}`與`{"y": 2, "x": 1}`是不同的
通常,欄位順序並不重要,無須讓資料庫模式依賴特定的欄位順序(MongoDB會對欄位重新排序)。
在某些特殊情況下,欄位順序變得非常重要
一些編程語言對文檔的默認表示根本就不包含順序問題(如:Python中的字典、Perl和Ruby
1.8中的散列)。通常,這些語言的驅動具有某些特殊的機制,可以在必要時指定文檔的順序。
- MongoDB不但區分類型,而且區分大小寫
下面的兩個文檔是不同的
```
{"foo" : 3}
{"foo" : "3"}
```
下面兩個文檔也是不同的
```
{"foo" : 3}
{"Foo" : 3}
```
- MongoDB的文檔不能有重複的鍵
下面的文檔是非法的:
```
{"greeting" : "Hello, world!", "greeting" : "Hello, MongoDB!"}
```
## 集合
- 集合就是一組文檔。
如果將MongoDB中的一個文檔比喻為關係型資料庫中的一行,那麼一個集合就相當於一張表。
- 動態模式
一個集合裡面的文檔可以是各式各樣的,這意味著,下面兩個文檔可以存儲在同一個集合裡面:
```
{"greeting" : "Hello, world!"}
{"foo" : 5}
```
————> 這裡引發一個問題:
> 因為集合裡面可以放置任何文檔,還有必要使用多個集合嗎?(既然沒有必要區分不同類型文檔的模式,為什麼還要使用多個集合呢)
>
>- 如果把各種各樣的文檔不加區分地放在同一個集合里,無論對開發者還是對管理員來
>說都將是噩夢。開發者要麼確保每次查詢只返回特定類型的文檔,要麼讓執行查詢的應用程序來處理所有不同類型的文檔。如果查詢博客文章時還要剔除含有作者數據的 文檔,這會帶來很大困擾。
>- 在一個集合里查詢特定類型的文檔在速度上也很不划算,分開查詢多個集合要快得多。例如,假設集合裡面一個名為"type"的欄位用於指明文檔是skim、whole還是 chunky monkey。那麼,如果從一個集合中查詢這三種類型的文檔,速度會很慢。但如果將這三種不同類型的文檔拆分為三個不同的集合,每次只需要查詢相應的集合,速 度快得多。
>- 把同種類型的文檔放在一個集合里,數據會更加集中。從一個只包含博客文章的集合里查詢幾篇文章,或者從同時含文章數據和作者數據的集合里查出幾篇文章,相比之下,前者需要的磁碟尋道操作更少。創建索引時,需要使用文檔的附加結構(特別是創建唯一索引時)。索引是按照集合來定義的。在一個集合中只放入一種類型的文檔,可以更有效地對集合進行索引。
上面這些重要原因促使我們創建一個模式,把相關類型的文檔組織在一起,儘管MongoDB對此並沒有強制要求。
## 資料庫
> 在MongoDB中,多個文檔組成集合,而多個集合可以組成資料庫。一個MongoDB實例可以承載多個資料庫,每個資料庫擁有0個或者多個集合。每個資料庫都有獨立的許可權,即便是在磁碟上,不同的資料庫也放置在不同的文件中。按照經驗,我們將有關一個應用程序的所有數據都存儲在同一個資料庫中。要想在同一個MongoDB伺服器上存放多個應用程序或者 用戶的數據,就需要使用不同的資料庫。
# 安裝
[Linux平台安裝MongoDB](Linux 平台安裝 MongoDB | 菜鳥教程)
或者
在 Ubuntu 16.04 上安裝 MongoDB 可參考 [MongoDB Docs][mongo-ubuntu]:
```bash
$ sudo apt-key adv --keyserver hkp://http://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6
$ echo "deb [ arch=amd64,arm64 ] Index of ubuntu xenial/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list
$ sudo apt-get update
$ sudo apt-get install -y mongodb-org
```
在 CentOS 7 上安裝 MongoDB 可參考 [MongoDB Docs][mongo-centos]:
```bash
$ sudo vi /etc/yum.repos.d/mongodb-org-3.4.repo
[mongodb-org-3.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc
$ sudo yum install -y mongodb-org
```
[mongo-ubuntu]: Install MongoDB Community Edition on Ubuntu
[mongo-centos]: Install MongoDB Community Edition on Red Hat Enterprise or CentOS Linux
![圖片描述][6]
- `mongod` : mongodb資料庫的執行程序(資料庫部署使用這個程序)
- `mongo` :用來連接mongodb數據伺服器的客戶端,對數據的所有操作,需要先使用mongo客戶端連接到mongodb伺服器之後才能進行
- `mongoimport` `mongoexport` 用來做mongodb的導入導出
- `mongodump` `mongorestore`用來導入導出二進位數據,不能被直接讀取,一般做數據的備份與恢復
- `mongooplog` 用來做操作日誌的回放,`oplog`是mongodb複製集中用來記錄操作記錄的數據集合
- `mongostat` 查看各種狀態
# 搭建簡單的mongodb伺服器
![圖片描述][7]
![圖片描述][8]
![圖片描述][9]
![圖片描述][10]
搭建MongoDB伺服器之後,需要使用客戶端連接,才能進行操作。
### 連接方法:
- 使用編譯時候生成的客戶端連接
![圖片描述][11]
- 使用各種驅動連接
### 關閉服務
- kill進程
在kill進程時候需要注意需要使用 `kill-15 `或者kill不加任何參數,不要使用`kill-9`。
[Linux kill -9 和 kill -15 的區別](Linux kill -9 和 kill -15 的區別)
- db.shutdownServer()
```
use admin
db.shutdownServer()
```
![圖片描述][12]
![圖片描述][13]
![圖片描述][14]
# 參考
[慕課網 mongoDB入門篇](mongoDB入門篇_mongoDB入門視頻教程-慕課網)
[MongoDB 實戰]
[MongoDB 權威指南]
[1]: /img/bVTIii
[2]: /img/bVTIi7
[3]: /img/bVTIj0
[4]: /img/bVTIkf
[5]: /img/bVTIuK
[6]: /img/bVTMPo
[7]: /img/bVTM8o
[8]: /img/bVTM8D
[9]: /img/bVTM8s
[10]: /img/bVTNai
[11]: /img/bVTNt3
[12]: /img/bVTNwg
[13]: /img/bVTNxM
[14]: /img/bVTNxN
推薦閱讀:
※mongodb學習資料整理
※MongoDB集群均衡
※酷站推薦 - docs.mongodb.com - MongoDB Documentation
※mongodb-導入導出-執行腳本
TAG:MongoDB |