標籤:

Mongodb學習記錄:入門(一)

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://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=repo.mongodb.org/yum/re$releasever/mongodb-org/3.4/x86_64/

gpgcheck=1

enabled=1

gpgkey=mongodb.org/static/pgp/

$ 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 |