閱讀828 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Mongodb學習記錄:入門(一)——五葉草

預熱看我之前的文章Node學習記錄: mongodb

這個係列旨在係統的學習Mongodb

部分圖片來自慕課網mongodb入門截圖

學習目標

圖片描述

圖片描述

圖片描述

圖片描述

MongoDB官網:https://www.mongodb.com/
MongoDB中文社區:https://www.mongoing.com/
mongodb github:https://github.com/mongodb

關係型數據庫 與 非關係型數據庫

MongoDB是一個麵向文檔(document-oriented)的數據庫,而不是關係型數據庫。不采用關
係模型主要是為了獲得更好的擴展性。當然, 還有其他一些好處。

圖片描述

與關係型數據庫相比,麵向文檔的數據庫不再有(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

或者

在 Ubuntu 16.04 上安裝 MongoDB 可參考 MongoDB Docs

$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6
$ echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/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

$ 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

圖片描述

  • mongod : mongodb數據庫的執行程序(數據庫部署使用這個程序)
  • mongo :用來連接mongodb數據服務器的客戶端,對數據的所有操作,需要先使用mongo客戶端連接到mongodb服務器之後才能進行
  • mongoimport mongoexport 用來做mongodb的導入導出
  • mongodump mongorestore用來導入導出二進製數據,不能被直接讀取,一般做數據的備份與恢複
  • mongooplog 用來做操作日誌的回放,oplog是mongodb複製集中用來記錄操作記錄的數據集合
  • mongostat 查看各種狀態 # 搭建簡單的mongodb服務器 圖片描述

圖片描述

圖片描述

圖片描述

搭建MongoDB服務器之後,需要使用客戶端連接,才能進行操作。

連接方法:

  • 使用編譯時候生成的客戶端連接

圖片描述

  • 使用各種驅動連接 ### 關閉服務
  • kill進程
    在kill進程時候需要注意需要使用 kill-15或者kill不加任何參數,不要使用kill-9
    Linux kill -9 和 kill -15 的區別

  • db.shutdownServer()

    use admin
    db.shutdownServer()
    

    圖片描述
    圖片描述
    圖片描述

參考

慕課網 mongoDB入門篇
[MongoDB 實戰]
[MongoDB 權威指南]

最後更新:2017-08-28 10:02:30

  上一篇:go  態勢感知 + DataV:安全可視化交互,這麼玩兒
  下一篇:go  行存、列存,堆表、AO表性能對比 - 阿裏雲HDB for PostgreSQL最佳實踐