MongoDB快速入門

1、NoSQL概述

NoSQL是Not Only SQL的縮寫,指的是非關係型數據庫,與傳統的關係型數據庫相對應,主要用於超大規模數據的存儲。前端

與RDBMS相比,具備以下特色:正則表達式

  • 沒有聲明性查詢語言
  • 沒有預約義模式
  • 鍵值對存儲
  • 最終一致性
  • 非結構化和不可預知的數據
  • CAP定理
  • 高性能和可伸縮性

優勢:高可擴展性;分佈式計算;低成本;半結構化數據;關係簡單。sql

缺點:沒有標準化;查詢功能有限;最終一致性沒有ACID直觀。mongodb

2、MongoDB概述

MongoDB是一個基於分佈式文件存儲的開源數據庫系統,爲Web應用提供可擴展的高性能數據存儲解決方案。將數據存儲爲一個文檔,數據結構由鍵值對組成。存儲的數據與應用的數據,在格式上(JSON)高度一致。數據庫

主要特色:express

  • 面向文檔存儲,操做簡單
  • 能夠設置任何屬性的索引
  • 支持豐富的查詢表達式
  • 容許在服務端執行腳本
  • 支持各類編程語言
  • 具備更高的擴展性
  • 能夠將負載分佈在各個節點

官網地址編程

3、主要概念

一、數據庫database

與RDBMS的概念相同。MongoDB的默認數據庫爲「db」,存儲在data目錄中。不一樣的數據庫放置在不一樣的文件中。json

數據庫名稱的限制:數組

  • 不能是空字符串
  • 不能包含空格、「.」、「/」、「」、「$」、空字符等
  • 應該所有小寫
  • 最長64個字節

保留的數據庫名稱:服務器

  • admin,至關於一個root數據庫,若是將用戶添加到該數據庫,那麼該用戶將自動得到全部數據庫的權限
  • local,這個數據庫不會被複制,能夠用來存儲僅限於本地單個服務器的任意集合
  • config,當Mongo用於分片設置時,該數據庫在內部使用,用來保存分片的相關信息

二、集合collection

至關於RDBMS中「表」的概念。集合沒有固定的結構,能夠插入不一樣格式和類型的數據。數據庫的信息存儲在dbname.system命名空間下的特殊集合中。

集合名稱的限制:

  • 不能是空字符串
  • 不能包含空字符,空字符表示集合名的結尾
  • 不能以system開頭,屬於系統保留的前綴
  • 不能包含保留字符

三、文檔document

至關於RDBMS中「行」的概念。MongoDB的文檔不須要設置相同的字段,而且相同字段不須要相同的數據類型。文檔的數據結構採用BSON格式,和JSON基本相同,BSON是一種類json的二進制形式的存儲格式。

使用文檔時須要注意:

  • 文檔中的鍵值對是有序的
  • 文檔中的值能夠是任意數據類型
  • 區分類型和大小寫
  • 不能有重複的鍵
  • 文檔的鍵是字符串

四、字段field

至關於RDBMS中「列」的概念。

字段的經常使用類型:

  • String,字符串類型,在MongoDB中,UTF-8纔是合法編碼
  • Integer,整形數值
  • Boolean,布爾值
  • Double,雙精度浮點值
  • Min/Max keys,將一個值與BSON(二進制的JSON)元素的最低值/最高值相比較
  • Arrays,將數組或列表或多個值存儲爲一個鍵
  • Timestamp,時間戳,記錄文檔修改或添加的具體時間
  • Object,用於內嵌文檔
  • Null,用於建立空值
  • Symbol,符號,基本等同於字符串類型
  • Date,日期時間
  • Object ID,用於建立文檔的ID
  • Binary Data,用於存儲二進制數據
  • Code,代碼類型,用於在文檔中存儲JavaScript代碼
  • Regular expression,正則表達式類型,用於存儲正則表達式

五、索引index

與RDBMS的概念相同。

六、主鍵primary key

自動將_id字段設置爲主鍵。

七、錶鏈接

不支持錶鏈接,但能夠經過嵌入文檔的方式實現。

4、用法

一、安裝

從官網下載並直接安裝,設置path環境變量。

二、啓動

直接啓動:

mongod

指定配置文件啓動:

mongod --config /etc/mongodb.conf

三、操做數據庫

建立數據庫:

use DATABASE_NAME

若是數據庫不存在,則建立數據庫,不然切換到指定的數據庫。

查看當前數據庫:

db

查看全部數據庫:

show dbs

刪除當前數據庫:

db.dropDatabase()

在刪除以前應該使用db命令查看當前數據庫名,或者使用use命令切換到要刪除的數據庫。

刪除集合:

db.collection.drop()

四、操做文檔

插入:

db.COLLECTION_NAME.insert(document)

若是集合不存在,MongoDB會自動建立該集合並插入文檔。若是不指定_id字段,save方法與insert方法相似。若是指定_id字段,save方法會更新該_id的數據。

更新:

db.COLLECTION_NAME.update(query, update, {upsert:boolean, multi:boolean, writeConcern:document})
  • query,更新的查詢條件,相對於sql的where語句
  • update,更新的對象和操做符,相對於sql的set語句
  • upsert,可選,若是要更新的記錄不存在,是否插入新記錄,true爲插入,默認false爲不插入
  • multi,可選,默認false爲只更新第一條記錄,若是爲true,則所有更新
  • writeConcern,可選,表示拋出異常的級別

經過傳入的文檔替換已有的文檔:

db.COLLECTION_NAME.save(document, {writeConcern:document})

刪除:

db.COLLECTION_NAME.remove(query, {justOne:boolean, writeConcern:document})
  • query,可選,要刪除的文檔的知足條件
  • justOne,可選,若是爲true,則只刪除一個文檔
  • writeConcern,可選,表示拋出異常的級別

若是不包含任何參數,則刪除集合中的全部文檔。建議在執行remove操做以前,先執行find命令來判斷執行條件是否正確。

查詢:

db.COLLECTION_NAME.find()

若是但願格式化查詢的結果,可使用pretty方法:

db.COLLECTION_NAME.find().pretty()

若是但願只返回一個文檔:

db.COLLECTION_NAME.findOne()

在find方法中,傳入多個鍵值對,每一個鍵值對之間以逗號分隔,等價於SQL中的and條件:

db.COLLECTION_NAME.find({key1:value1, key2:value2})

在find方法中,使用關鍵字$or,等價於SQL中的or條件:

db.COLLECTION_NAME.find({$or:[{key1:value1, key2:value2}]})

在MongoDB中,有四種條件操做符,分別是$gt、$lt、$gte、$lte,對應SQL中的大於、小於、大於等於和小於等於。

db.COLLECTION_NAME.find({key: {$gt : value}})

還有一個條件操做符$type,用來判斷字段的類型:

db.COLLECTION_NAME.find({key: {$type : typeid}})

使用limit方法,指定要讀取的記錄數量:

db.COLLECTION_NAME.find().limit(NUMBER)

使用skip方法,跳過指定數量的記錄,參數默認爲0:

db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)

使用sort方法,指定排序的字段,參數爲1表示升序,-1表示降序,默認按照升序排列:

db.COLLECTION_NAME.find().sort({KEY:1})

使用aggregate方法,處理數據並返回計算後的數據結果:

db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)

聚合操做包括:

  • $sum,計算求和
  • $avg,計算平均值
  • $min,獲取最小值
  • $max,獲取最大值
  • $push,插入值到一個數組中
  • $addToSet,插入值到一個數組中,但不建立副本
  • $first,根據排序獲取第一個文檔數據
  • $last,根據排序獲取最後一個文檔數據

在MongoDB中,可使用聚合管道,將文檔在一個管道處理完畢以後把結果傳遞給下一個管道處理。

經常使用的管道操做:

  • $project,修改輸入文檔的結構,能夠用來重命名、增長或刪除字段,也能夠用來建立計算結果以及嵌套文檔
  • $match,用於過濾數據,只輸出符合條件的文檔
  • $limit,用來限制聚合管道返回的文檔數
  • $skip,在聚合管道中跳過指定數量的文檔
  • $unwind,將文檔中的某一個數組類型字段拆分紅多條,每條包含數組中的一個值
  • $group,將集合中的文檔分組,用於統計結果
  • $sort,將輸入文檔進行排序以後輸出
  • $geoNear,輸出接近某一地理位置的有序文檔

索引是特殊的數據結構,存儲在一個易於遍歷讀取的數據集合中,是對數據庫表中的若干字段的值進行排序的一種結構。MongoDB還提供多個可選參數,用來限定索引的規則。

建立索引:

db.COLLECTION_NAME.ensureIndex({KEY:1})

五、數據庫的備份和恢復

複製:將數據同步在多個服務器的過程。提供了數據的冗餘備份,並在多個服務器上存儲數據副本。容許從硬件故障和服務中斷中恢復數據。複製至少須要兩個節點,其中一個是主節點,負責處理客戶端請求,其他都是從節點,負責複製主節點的數據。

分片:當存儲海量數據時,一臺機器不足以存儲數據,也不足以提供可接受的讀寫量。能夠經過在多臺機器上分割數據,使得數據庫系統可以存儲和處理更多的數據。Shard用於存儲實際的數據塊,實際使用中一個shard server能夠由幾臺機器組成。Config server存儲整個ClusterMetadata,其中包括chunk信息。Query routers前端路由,客戶端由此接入。

備份:在MongoDB中,可使用mongodump命令來備份數據,該命令能夠導出全部數據到指定目錄。

mongodump -h dbhost -d dbname -o dbdirectory

恢復:在MongoDB中,可使用mongorestore命令來恢復備份的數據。

mongorestore -h dbhost -d dbname --directoryperdb dbdirectory

六、數據庫的監控

在安裝部署並啓動MongoDB服務後,必須瞭解運行狀況,並查看其性能。

mongostat是MongoDB自帶的狀態檢測工具。mongotop用來跟蹤一個MongoDB實例,查看讀寫所花費的時間。這兩個工具都位於MongoDB的安裝目錄的bin目錄下。

相關文章
相關標籤/搜索