探索 MongoDB--转
原文地址:https://www.ibm.com/developerworks/cn/opensource/os-mongodb4/index.html?mhq=mongodb&mhsrc=ibmsearch_a
MongoDB 是什么?
近幾年來(lái),我們已經(jīng)看到不同于傳統(tǒng)關(guān)系模型的數(shù)據(jù)庫(kù)管理系統(tǒng)越來(lái)越受歡迎。它的核心是 NoSQL 概念,這個(gè)共同的術(shù)語(yǔ)表示不使用 SQL 語(yǔ)言與數(shù)據(jù)庫(kù)交互的數(shù)據(jù)庫(kù)軟件。比較著名的 NoSQL 項(xiàng)目之一就是 MongoDB,一個(gè)開(kāi)放源碼、面向文檔的數(shù)據(jù)庫(kù),它在類似于 JSON 的文檔集合存儲(chǔ)數(shù)據(jù)。MongoDB 相比其他 NoSQL 數(shù)據(jù)庫(kù)的優(yōu)勢(shì)之一是它強(qiáng)大的、基于文檔的查詢語(yǔ)言,由于查詢非常容易轉(zhuǎn)換,這使得從關(guān)系數(shù)據(jù)庫(kù)到 MongoDB 的過(guò)渡變得簡(jiǎn)單。
MongoDB 是用 C++ 語(yǔ)言編寫(xiě)的。它在類似于 JSON 的文檔中存儲(chǔ)數(shù)據(jù)(使用 BSON,一個(gè) JSON 的二進(jìn)制版本),存儲(chǔ)數(shù)據(jù)的方式是使用鍵/值對(duì)。MongoDB 優(yōu)于其他文檔數(shù)據(jù)庫(kù)的一個(gè)特性是它很容易將 SQL 語(yǔ)句轉(zhuǎn)換成 MongoDB 查詢函數(shù)調(diào)用。這使得當(dāng)前使用關(guān)系數(shù)據(jù)庫(kù)的組織很容易遷移到 MongoDB。它也很容易安裝和使用,有二進(jìn)制和驅(qū)動(dòng)程序兩種形式,兼容主流操作系統(tǒng)和編程語(yǔ)言。
MongoDB 是一個(gè)開(kāi)放源碼項(xiàng)目,其數(shù)據(jù)庫(kù)基于 GNU AGPL (Affero General Public License) version 3.0 的許可。此許可是 GNU GPL 的一個(gè)修正版,它彌補(bǔ)了版權(quán)限制不適用于軟件使用而僅適用軟件分發(fā)的漏洞。這對(duì)于在云中存儲(chǔ)而不經(jīng)常安裝在客戶端設(shè)備上的軟件當(dāng)然是重要的。使用常規(guī) GPL ,您會(huì)感覺(jué)到實(shí)際上無(wú)法進(jìn)行分發(fā),因此潛在地規(guī)避了許可條款。
AGPL 只適用于它自己的數(shù)據(jù)庫(kù)應(yīng)用程序,不適用于 MongoDB 的其他組成部分。允許開(kāi)發(fā)人員從各種編程語(yǔ)言連接 MongoDB 的官方驅(qū)動(dòng)程序在 Apache License Version 2.0 許可下分發(fā)。 MongoDB 文檔的使用基于 Creative Commons 許可。
面向文檔的數(shù)據(jù)庫(kù)
面向文檔的數(shù)據(jù)庫(kù)與傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)有很大不同。與在類似于表的固定結(jié)構(gòu)中存儲(chǔ)數(shù)據(jù)不同,面向文檔的數(shù)據(jù)庫(kù)在松散定義的文檔中存儲(chǔ)數(shù)據(jù)。利用關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS)表,如果您需要添加一個(gè)新的列,您需要改變表本身的定義,這會(huì)將該列添加到每一條現(xiàn)有的記錄(雖然可能是一個(gè)空值)。這是由于 RDBMS 嚴(yán)格的基于模式的設(shè)計(jì)。然而,利用文檔時(shí),您可在不改變?nèi)魏纹渌臋n的情況下為個(gè)別文檔添加新屬性。這是因?yàn)槊嫦蛭臋n的數(shù)據(jù)庫(kù)在設(shè)計(jì)上通常非模式化的。
另一個(gè)基本差異是面向文檔的數(shù)據(jù)庫(kù)不在文檔之間規(guī)定嚴(yán)格的關(guān)系。這有助于維護(hù)它們的非模式化設(shè)計(jì)。這與十分依賴規(guī)范化數(shù)據(jù)存儲(chǔ)關(guān)系的關(guān)系型數(shù)據(jù)庫(kù)有很大不同。與在一個(gè)單獨(dú)的存儲(chǔ)區(qū)存儲(chǔ)相關(guān)數(shù)據(jù)不同,在文檔數(shù)據(jù)庫(kù)中它們被嵌入文檔本身,這要比將引用存儲(chǔ)到另一個(gè)存儲(chǔ)相關(guān)數(shù)據(jù)的文檔中要快得多,因?yàn)槊總€(gè)引用都需要一個(gè)附加查詢。
對(duì)于許多應(yīng)用程序來(lái)說(shuō),如果它需要在一個(gè)父文檔中包含自成體系的數(shù)據(jù),這種面向文檔的數(shù)據(jù)庫(kù)非常適合。一個(gè)好的示例(可在 MongoDB 文檔中找到)是博客文章和評(píng)論。評(píng)論只適用于一篇文章,所以把它們從該文章分開(kāi)是無(wú)意義的。在 MongoDB 中,有關(guān)博客文章的文檔只需要一個(gè)?comments?屬性來(lái)存儲(chǔ)該文章的評(píng)論。而如果使用關(guān)系數(shù)據(jù)庫(kù),則可能需要一個(gè)帶 ID 主關(guān)鍵字的 comments 表、一個(gè)帶 ID 主關(guān)鍵字的 posts 表和一個(gè)中間的映射表 post_comments,此映射表用于定義哪個(gè)評(píng)論屬于哪篇文章。這為本應(yīng)很簡(jiǎn)單的事增加了不必要的復(fù)雜性。
不過(guò),如果您必須分開(kāi)存儲(chǔ)相關(guān)數(shù)據(jù),在 MongoDB 中也可以簡(jiǎn)單地使用一個(gè)獨(dú)立的集合來(lái)完成。另一個(gè)好的示例是您把客戶訂單信息存儲(chǔ)在 MongoDB 文檔中。它通常包含以下信息:客戶、訂單、訂單條目和產(chǎn)品信息。使用 MongoDB ,您可以在獨(dú)立的集合中存儲(chǔ)客戶、產(chǎn)品和訂單,但是您需要把訂單項(xiàng)數(shù)據(jù)嵌入在相關(guān)的訂單文檔中。然后,您需要使用類似于外部關(guān)鍵字的 ID 來(lái)引用?products?和?customers?集合。由于這種混合方法非常簡(jiǎn)單,使得 MongoDB 成為已習(xí)慣于使用 SQL 的開(kāi)發(fā) 人員的極好選擇。如上所述,應(yīng)該花點(diǎn)時(shí)間細(xì)心地為每個(gè)單獨(dú)用例選擇合適的方法,因?yàn)橄啾扔趶钠渌现幸脭?shù)據(jù),采用在文檔中嵌入數(shù)據(jù)的方法將獲得顯著的性能收益。
功能概覽
MongoDB 不僅僅是一個(gè)基本的鍵/值對(duì)存儲(chǔ)數(shù)據(jù)庫(kù),讓我們簡(jiǎn)單地看一下它的其他特性:
- 可用于 Windows?、Mac OS X、Linux? 和 Solaris 的官方二進(jìn)制版本,可用于自構(gòu)建的源代碼分發(fā)
- 可用于 C、C#、C++、Haskell、Java?、JavaScript、Perl、PHP、Python、Ruby 和 Scala 的官方驅(qū)動(dòng)程序,以及廣泛可用于其他語(yǔ)言的社區(qū)支持的驅(qū)動(dòng)程序。
- Ad-hoc JavaScript 查詢讓您能夠使用基于任何文檔屬性的任何條件來(lái)查找數(shù)據(jù)。這些查詢對(duì)應(yīng)于 SQL 查詢的功能,使 SQL 開(kāi)發(fā)人員能夠很直觀地編寫(xiě) MongoDB 查詢。
- 支持查詢中的正則表達(dá)式
- MongoDB 查詢結(jié)果存儲(chǔ)在提供過(guò)濾、聚合和排序等一系列功能的游標(biāo)中,包括?limit()、skip()、?sort()、count()、distinct()?和?group()。
- 高級(jí)聚合的?map/reduce?實(shí)現(xiàn)
- 使用 GridFS 的大文件存儲(chǔ)
- 類似于 RDBMS 的屬性索引支持,您可以直接在文檔的選定屬性上創(chuàng)建索引
- 使用提示、解釋計(jì)劃和分析的查詢優(yōu)化特性
- 類似于 MySQL 的主/從復(fù)制
- 基于集合的對(duì)象存儲(chǔ),在需要規(guī)范化數(shù)據(jù)時(shí)允許參考查詢
- 通過(guò)自動(dòng)分片功能水平擴(kuò)展
- 高性能無(wú)爭(zhēng)用并發(fā)機(jī)制的即時(shí)更新
- 在線 shell 讓您能夠不安裝 MongoDB 即可試用
- 深入的文檔資料,已出版或正在寫(xiě)作中的多本圖書(shū)
安裝 MongoDB
幸運(yùn)的是,MongoDB 在各種平臺(tái)上的安裝都非常簡(jiǎn)單。二進(jìn)制發(fā)行版在 Windows、Mac OS X、 Linux 和 Solaris 上都可以使用,同時(shí),各種包管理器為其他系統(tǒng)提供了簡(jiǎn)單的安裝和設(shè)置選項(xiàng)。如果您夠勇敢,可以自己編譯源代碼。在本節(jié)中,您將學(xué)會(huì)如何在 Windows 和 OS X 上安裝 MongoDB,在 Windows 上將進(jìn)程設(shè)置為服務(wù)或在 OS X 上將進(jìn)程設(shè)置為守護(hù)程序。
在 Windows 上安裝
在 Windows 上安裝 MongoDB 十分簡(jiǎn)單。在 Web 瀏覽器中,轉(zhuǎn)到 http://www.mongodb.org/downloads 并下載適用于 Windows 的最新版本的穩(wěn)定產(chǎn)品。如果您正使用 64 位版本的 Windows 操作系統(tǒng),建議使用 64 位版本。如果您不確定,就使用 32 位版本。
把壓縮文件解壓到 C:\ 驅(qū)動(dòng)器,這將創(chuàng)建一個(gè)名稱類似于 mongodb-win32-i386-1.6.4 的文件夾。為了簡(jiǎn)便,將這個(gè)文件夾重命名為 mongo 。接下來(lái),需要?jiǎng)?chuàng)建一個(gè)數(shù)據(jù)目錄。在 Windows 資源管理器中,轉(zhuǎn)到 C:\ 驅(qū)動(dòng)器的根目錄下并創(chuàng)建一個(gè)名為 data 的新文件夾。在此文件夾中,創(chuàng)建一個(gè)名為 db 的文件夾。
您現(xiàn)在可以啟動(dòng) MongoDB 服務(wù)器。使用 Windows 資源管理器導(dǎo)航至 C:\mongo\bin 并雙擊 mongod.exe。關(guān)閉打開(kāi)的命令提示符窗口將會(huì)停止 MongoDB 服務(wù)器。因此,將 MongoDB 服務(wù)器設(shè)置為 Windows 服務(wù)更為方便。我們現(xiàn)在來(lái)完成。
打開(kāi)命令提示符窗口 (啟動(dòng) > 運(yùn)行 >,輸入?cmd?并按?確定),然后發(fā)出清單 1?中的命令。
清單 1. 將 MongoDB 服務(wù)器設(shè)置為一個(gè)服務(wù)
| 1 2 3 | > cd \mongo\bin > mongod --install --logpath c:\mongo\logs --logappend --bind_ip 127.0.0.1 --directoryperdb |
您將看到清單 2?中的輸出。
清單 2. 創(chuàng)建服務(wù)成功
| 1 2 3 4 | all output going to c:\mongo\logs Creating service MongoDB. Service creation successful. Service can be started from the command line via 'net start "MongoDB"'. |
將 Mongo 作為服務(wù)安裝后,您現(xiàn)在可以用以下命令啟動(dòng)它:> net start "MongoDB"
您將看到清單 3?中的輸出。
清單 3. Mongo 成功啟動(dòng)
| 1 2 | The Mongo DB service is starting. The Mongo DB service was started successfully. |
您現(xiàn)在可以運(yùn)行 MongoDB shell 客戶端。如果現(xiàn)在有一個(gè)命令提示符窗口打開(kāi),確認(rèn)位于 c:\mongo\bin 文件夾中并輸入以下命令:> mongo.
另一種方法是,在 Windows 資源管理器中導(dǎo)航至 C:\mongo\bin 并雙擊 mongo.exe。無(wú)論選擇哪種方法來(lái)啟動(dòng) shell,您都應(yīng)看到如清單 4中所示的提示。
清單 4. 啟動(dòng) shelll
| 1 2 3 | MongoDB shell version: 1.8.1 connecting to: test > |
如果您不想在 Mac OS X 計(jì)算機(jī)上設(shè)置 MongoDB,現(xiàn)在可以跳過(guò)本節(jié)的下一部分,轉(zhuǎn)到“入門(mén)指南”,您將學(xué)習(xí)如何使用 shell 客戶端與 MongoDB 服務(wù)器進(jìn)行交互。
在 Mac OS X 中安裝
假設(shè)您現(xiàn)在使用 Mac OS X 的 64 位版本,以下步驟詳細(xì)說(shuō)明了如何下載 MongoDB 的 64 位 OS X 二進(jìn)制版本,解壓它,配置并開(kāi)始使用,還將教您如何作為守護(hù)程序運(yùn)行 MongoDB。
首先,啟動(dòng) Terminal (Applications>Utilities>Terminal)。在 Terminal 窗口,運(yùn)行清單 5?中的命令。
清單 5. 在 Mac OS X上設(shè)置 MongoDB
| 1 2 3 4 5 | $ cd ~ $ curl http://fastdl.mongodb.org/osx/mongodb-osx-x86_64-1.6.4.tgz > mongo.tgz $ tar xzf mongo.tgz $ mv mongodb-osx-x86_64-1.8.1/ mongo $ mkdir -p /data/db |
MongoDB 現(xiàn)在設(shè)置完成并準(zhǔn)備使用。在繼續(xù)之前,最好把 MongoDB 添加到您的路徑中,執(zhí)行以下命令:?$ nano ~/.bash_profile.
此文件可能還不存在。在這種情況下,添加以下行:?export PATH={$PATH}:~/mongo/bin.
按 ctrl + O 保存文件,然后在提示符下按 Enter。再按 ctrl + X 退出。現(xiàn)在,用以下命令重新載入 bash 配置文件:?$ source ~/.bash_profile.
您現(xiàn)在已經(jīng)準(zhǔn)備好啟動(dòng) MongoDB。只需發(fā)出以下命令就可以啟動(dòng):?$ mongod.
這將作為前臺(tái)進(jìn)程啟動(dòng) MongoDB 數(shù)據(jù)庫(kù)服務(wù)器。如果您想作為后臺(tái)守護(hù)程序啟動(dòng) MongoDB ,發(fā)出以下命令:?$ sudo mongod --fork --logpath /var/log/mongodb.log --logappend.
將要求您輸入密碼,在此提示下輸入 Mac OS X 管理員密碼。
無(wú)論您選擇哪種方法啟動(dòng) MongoDB,服務(wù)器現(xiàn)在都能運(yùn)行。如果作為前臺(tái)進(jìn)程啟動(dòng),您將需要一個(gè)單獨(dú)的 Terminal 標(biāo)簽或窗口來(lái)啟動(dòng)客戶端。要啟動(dòng)客戶端,只需使用命令:$ mongo
將會(huì)看到清單 6?中的提示:
清單 6. 啟動(dòng)客戶端
| 1 2 3 | MongoDB shell version: 1.8.1 connecting to: test > |
在下一節(jié)中,您將學(xué)習(xí)如何使用 MongoDB shell 來(lái)創(chuàng)建數(shù)據(jù)庫(kù)、集合、文檔等。
MongoDB 使用入門(mén)
MongoDB 發(fā)行版包含一個(gè) shell 應(yīng)用程序,使您能夠完全控制數(shù)據(jù)庫(kù)。通過(guò)使用 shell,您可以使用服務(wù)器端 JavaScript 功能來(lái)創(chuàng)建和管理數(shù)據(jù)庫(kù)、集合、文件和索引。這使快速啟動(dòng)和運(yùn)行 MongoDB 變得容易。在本節(jié)中,您將學(xué)習(xí)如何啟動(dòng) shell 并了解一些進(jìn)行基本數(shù)據(jù)庫(kù)存儲(chǔ)和檢索的命令。
MongoDB shell
MongoDB shell 應(yīng)用程序包含在 MongoDB 發(fā)行版的 bin 文件夾中。在 Windows 系統(tǒng)中,它就是 mongo.exe 應(yīng)用程序。在 Windows 資源管理器中,雙擊此程序即可啟動(dòng) shell 。在基于 UNIX? 的操作系統(tǒng)中(包括 Mac OS X),您可通過(guò)在一個(gè)終端窗口(假使您按照以上說(shuō)明將 MongoDB 目錄加入到路徑)執(zhí)行 mongo 命令啟動(dòng) MongoDB shell。
第一次啟動(dòng) shell 時(shí),您將看到清單 7?中消息。
清單 7. 啟動(dòng) shell 時(shí)的消息
| 1 2 3 | MongoDB shell version: 1.8.1 connecting to: test > |
您現(xiàn)在已連接到本地 MongoDB 服務(wù)器,尤其是“測(cè)試”服務(wù)器。在下一節(jié)中,您將學(xué)習(xí)如何創(chuàng)建數(shù)據(jù)庫(kù)、文檔和集合。如果您在某個(gè)階段需要幫助,只需要在 Mongo shell 提示符下發(fā)出 "help" 命令。?圖 1?顯示了典型的幫助命令的輸出。
圖 1. Mongo shell?help命令的輸出
如果您想查看 MongoDB 函數(shù)背后的源代碼,只需簡(jiǎn)單地在 shell 中輸入函數(shù)的名稱,它將會(huì)輸出 JavaScript 源代碼。例如,輸入?connect?后按回車鍵,您將看到用于連接 MongoDB 數(shù)據(jù)庫(kù)的源代碼。
創(chuàng)建數(shù)據(jù)庫(kù)、集合和文檔
默認(rèn)情況下,Mongo shell 連接到“測(cè)試”數(shù)據(jù)庫(kù)。如果要切換到一個(gè)不同的數(shù)據(jù)庫(kù),使用 “use 數(shù)據(jù)庫(kù)名” 命令。如果數(shù)據(jù)庫(kù)不存在,在您將數(shù)據(jù)添加到數(shù)據(jù)庫(kù)時(shí),MongoDB 將會(huì)創(chuàng)建它。用以下命令切換到 "mymongo" 數(shù)據(jù)庫(kù):?> use mymongo.
shell 將返回以下信息:?switched to db mymongo.
這時(shí),數(shù)據(jù)庫(kù)仍未真正存在,因?yàn)樗鼪](méi)有包含任何數(shù)據(jù)。在 MongoDB 中,數(shù)據(jù)以集合的形式存儲(chǔ)。如果需要,您可以分割文檔。下面創(chuàng)建一個(gè)文檔并把它存儲(chǔ)到一個(gè)名為 "colors" 的新集合中:?> db.colors.save({name:"red",value:"FF0000"});.
通過(guò)查詢數(shù)據(jù)庫(kù)來(lái)驗(yàn)證文檔已保存:?> db.colors.find();.
您將看到類似于下面的響應(yīng)(_id?屬性是唯一標(biāo)識(shí)符,與您的結(jié)果可能會(huì)不同):?{ "_id" : ObjectId("4cfa43ff528bad4e29beec57"), "name" : "red", "value" : "FF0000" }.
MongoDB 中的文檔以 BSON(二進(jìn)制 JSON)形式存儲(chǔ)。通過(guò) Mongo shell,可以使用類似于 JSON 的語(yǔ)法插入數(shù)據(jù),其中每個(gè)文檔都是一個(gè)鍵-值對(duì)形式的對(duì)象。在這個(gè)例子中,我們創(chuàng)建一個(gè)具有兩個(gè)屬性的文檔:name?和?value,值分別為?red?和?FF0000(標(biāo)準(zhǔn)紅色的十六進(jìn)制表示形式)。
您可能已經(jīng)注意到,不需要預(yù)定義?colors?集合,當(dāng)您使用存儲(chǔ)功能插入一個(gè)條目時(shí),文檔將自動(dòng)創(chuàng)建。
在這個(gè)例子中,您創(chuàng)建了一個(gè)非常簡(jiǎn)單的文檔。然而,使用類似于 JSON 的語(yǔ)法可以創(chuàng)建更復(fù)雜的文檔。考慮下面的 JSON 文檔,它表示了一個(gè)訂單或發(fā)票(參見(jiàn)?清單 8)。
清單 8. 創(chuàng)建一個(gè)簡(jiǎn)單的文檔
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | { ????order_id: 109384, ????order_date: new Date("12/04/2010"), ????customer: { ????????name: "Joe Bloggs", ????????company: "XYZ Inc.", ????????phone: "(555) 123-4567" ????}, ????payment: { ????????type: "Cash", ????????amount: 4075.99, ????????paid_in_full: true ????}, ????items: [ ????????{ ????????????sku: "ABC1200", ????????????description: "A sample product", ????????????quantity: 1, ????????????price_per_unit: 75.99, ????????}, { ????????????sku: "XYZ3400", ????????????description: "An expensive product", ????????????quantity: 2, ????????????price_per_unit: 2000 ????????} ????], ????cashier_id: 340582242 } |
您可以看到,這些文檔可以存儲(chǔ)包括字符串、整數(shù)、浮點(diǎn)數(shù)、日期、對(duì)象、數(shù)組等的各種數(shù)據(jù)類型。在清單 8 中,訂單條目直接嵌入在訂單文檔中,使得以后查詢文檔時(shí)檢索信息快得多。
由于 MongoDB shell 使用 JavaScript,當(dāng)您與數(shù)據(jù)庫(kù)交互時(shí),可以編寫(xiě)規(guī)則的 JavaScript 結(jié)構(gòu) 。以清單 9為例,它創(chuàng)建一個(gè)字符文檔集合,每個(gè)集合都包含字符的字符串表示形式及其關(guān)聯(lián)的 ASCII 代碼。
清單 9. 創(chuàng)建一個(gè)字符文檔集合
| 1 2 3 4 5 6 | > var chars = "abcdefghijklmnopqrstuvwxyz" > for(var i =0; i<chars.length; i++) {??? ... var char = chars.substr(i, 1);????????? ... var doc = {char:char, code: char.charCodeAt(0)}; ... db.alphabet.save(doc); ... } |
此循環(huán)將創(chuàng)建 26 個(gè)文檔,代表字母表的每個(gè)小寫(xiě)字母,每個(gè)文檔包含字符本身及其 ASCII 字符碼。在下一節(jié)中,您將學(xué)習(xí)如何用不同方法檢索數(shù)據(jù)。
檢索數(shù)據(jù)
在最后一節(jié)中,您不僅會(huì)學(xué)習(xí)如何向 MongoDB 數(shù)據(jù)庫(kù)中插入數(shù)據(jù),而且會(huì)實(shí)際學(xué)習(xí)如何使用最基本的數(shù)據(jù)檢索函數(shù) find。我們以上一節(jié)結(jié)尾時(shí)創(chuàng)建的字母表集合為例,學(xué)習(xí)使用 find 命令:?db.alphabet.find();。
這將生成如清單 10?所示的響應(yīng)。
清單 10. 生成響應(yīng)
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | > db.alphabet.find() { "_id" : ObjectId("4cfa4adf528bad4e29beec8c"), "char" : "a", "code" : 97 } { "_id" : ObjectId("4cfa4adf528bad4e29beec8d"), "char" : "b", "code" : 98 } { "_id" : ObjectId("4cfa4adf528bad4e29beec8e"), "char" : "c", "code" : 99 } { "_id" : ObjectId("4cfa4adf528bad4e29beec8f"), "char" : "d", "code" : 100 } { "_id" : ObjectId("4cfa4adf528bad4e29beec90"), "char" : "e", "code" : 101 } { "_id" : ObjectId("4cfa4adf528bad4e29beec91"), "char" : "f", "code" : 102 } { "_id" : ObjectId("4cfa4adf528bad4e29beec92"), "char" : "g", "code" : 103 } { "_id" : ObjectId("4cfa4adf528bad4e29beec93"), "char" : "h", "code" : 104 } { "_id" : ObjectId("4cfa4adf528bad4e29beec94"), "char" : "i", "code" : 105 } { "_id" : ObjectId("4cfa4adf528bad4e29beec95"), "char" : "j", "code" : 106 } { "_id" : ObjectId("4cfa4adf528bad4e29beec96"), "char" : "k", "code" : 107 } { "_id" : ObjectId("4cfa4adf528bad4e29beec97"), "char" : "l", "code" : 108 } { "_id" : ObjectId("4cfa4adf528bad4e29beec98"), "char" : "m", "code" : 109 } { "_id" : ObjectId("4cfa4adf528bad4e29beec99"), "char" : "n", "code" : 110 } { "_id" : ObjectId("4cfa4adf528bad4e29beec9a"), "char" : "o", "code" : 111 } { "_id" : ObjectId("4cfa4adf528bad4e29beec9b"), "char" : "p", "code" : 112 } { "_id" : ObjectId("4cfa4adf528bad4e29beec9c"), "char" : "q", "code" : 113 } { "_id" : ObjectId("4cfa4adf528bad4e29beec9d"), "char" : "r", "code" : 114 } { "_id" : ObjectId("4cfa4adf528bad4e29beec9e"), "char" : "s", "code" : 115 } { "_id" : ObjectId("4cfa4adf528bad4e29beec9f"), "char" : "t", "code" : 116 } has more > |
默認(rèn)情況下,find()?函數(shù)會(huì)檢索集合中的所有文檔,但只顯示前 20 個(gè)文檔。給出命令?it?將檢索剩余的 6 個(gè)文檔(參見(jiàn)清單 11)。
清單 11. 檢索剩余的 6 個(gè)文檔
| 1 2 3 4 5 6 7 8 | > it { "_id" : ObjectId("4cfa4adf528bad4e29beeca0"), "char" : "u", "code" : 117 } { "_id" : ObjectId("4cfa4adf528bad4e29beeca1"), "char" : "v", "code" : 118 } { "_id" : ObjectId("4cfa4adf528bad4e29beeca2"), "char" : "w", "code" : 119 } { "_id" : ObjectId("4cfa4adf528bad4e29beeca3"), "char" : "x", "code" : 120 } { "_id" : ObjectId("4cfa4adf528bad4e29beeca4"), "char" : "y", "code" : 121 } { "_id" : ObjectId("4cfa4adf528bad4e29beeca5"), "char" : "z", "code" : 122 } > |
find()?函數(shù)實(shí)際上向查詢結(jié)果集返回了一個(gè)指針,在本例中是檢索所有文件。如果沒(méi)有分配一個(gè)變量或沒(méi)有執(zhí)行其他函數(shù),它將在屏幕上默認(rèn)打印一個(gè)樣例結(jié)果集。要顯示所有結(jié)果集,應(yīng)執(zhí)行以下命令:?> db.alphabet.find().forEach(printjson);。
這將打印結(jié)果集中的每條記錄,而不是顯示一個(gè)子集。接下來(lái)我們將了解更多有關(guān)使用指針和查詢來(lái)篩選數(shù)據(jù)的方法。
查詢數(shù)據(jù)
MongoDB 最強(qiáng)大的功能之一是它對(duì) ad-hoc 查詢的強(qiáng)大支持,其工作方式與傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)幾乎一樣,它篩選和返回 BSON 文檔而不是表中的行。這種方法使它有別于其他文檔存儲(chǔ),對(duì)于 SQL 開(kāi)發(fā)人員來(lái)說(shuō),這一點(diǎn)很難掌握。利用 MongoDB ,相對(duì)復(fù)雜的 SQL 查詢可以簡(jiǎn)單地轉(zhuǎn)換為 JavaScript 函數(shù)調(diào)用。在本節(jié)中,您將學(xué)習(xí)可讓您在 MongoDB 中查詢數(shù)據(jù)的各種函數(shù),以及如何建立索引來(lái)幫助優(yōu)化查詢,就像在 DB2、MySQL 或 Oracle 中一樣。
基本查詢
在上一節(jié)中,您學(xué)習(xí)了如何使用 find 函數(shù)來(lái)檢索所有文檔。find 函數(shù)接受一系列參數(shù)來(lái)篩選返回的結(jié)果。例如,在上面創(chuàng)建的字母表集合中,您能用以下命令找到 "char" 屬性的值為 "q" 的任何記錄:?> db.alphabet.find({char: "o"});。
這將返回以下響應(yīng):?{ "_id" : ObjectId("4cfa4adf528bad4e29beec9a"), "char" : "o", "code" : 111 }。
如果您想要返回編碼小于或等于 100 的所有字符,可以使用以下命令:?> db.alphabet.find({code:{$lte:100}});.
這將返回清單 12?中的結(jié)果,與您期望的一致。
清單 12. 結(jié)果
| 1 2 3 4 | { "_id" : ObjectId("4cfa4adf528bad4e29beec8c"), "char" : "a", "code" : 97 } { "_id" : ObjectId("4cfa4adf528bad4e29beec8d"), "char" : "b", "code" : 98 } { "_id" : ObjectId("4cfa4adf528bad4e29beec8e"), "char" : "c", "code" : 99 } { "_id" : ObjectId("4cfa4adf528bad4e29beec8f"), "char" : "d", "code" : 100 } |
MongoDB 支持各種條件運(yùn)算符,包括:
- $lt?(小于)
- $lte?(小于等于)
- $gt?(大于)
- $gte?(大于等于)
- $all?(匹配數(shù)組中的所有值)
- $exists?(檢查字段是否存在)
- $mod?(模數(shù))
- $ne?(不等)
- $in?(匹配數(shù)組一個(gè)或多個(gè)值)
- $nin?(匹配數(shù)組中的零值)
- $or?(匹配一個(gè)或另一個(gè)查詢)
- $nor?(不匹配查詢)
- $size?(匹配具有預(yù)定數(shù)量元素的任何數(shù)組)
- $type?(匹配具有指定 BSON 數(shù)據(jù)類型的值)
- $not?(不等于)
有關(guān)所有這些運(yùn)算符的詳細(xì)信息,請(qǐng)參閱 MongoDB 文檔(參見(jiàn)參考資料中的鏈接)。
您可以使用 find 函數(shù)中的第二個(gè)參數(shù)來(lái)限制查詢返回的字段。例如,下面的查詢只返回所有文檔中編碼值范圍在 102 至 105 之間的?char?屬性:?> db.alphabet.find({code:{$in:[102,103,104,105]}}, {char: 1});.
這將產(chǎn)生?清單 13?中的結(jié)果。
清單 13. 結(jié)果
| 1 2 3 4 | { "_id" : ObjectId("4cfa4adf528bad4e29beec91"), "char" : "f" } { "_id" : ObjectId("4cfa4adf528bad4e29beec92"), "char" : "g" } { "_id" : ObjectId("4cfa4adf528bad4e29beec93"), "char" : "h" } { "_id" : ObjectId("4cfa4adf528bad4e29beec94"), "char" : "i" } |
在下一節(jié)中,您將學(xué)習(xí)如何創(chuàng)建索引來(lái)加速查詢。
索引
MongoDB 索引與關(guān)系數(shù)據(jù)庫(kù)中的索引十分相似。您可以基于任何屬性建立索引。此外,索引后的字段可以是任何數(shù)據(jù)類型,包括一個(gè)對(duì)象或數(shù)組。與 RDBMS 索引相似,可以使用多個(gè)屬性創(chuàng)建復(fù)合索引,也可創(chuàng)建唯一索引,確保不存在重復(fù)的值。
要?jiǎng)?chuàng)建一個(gè)基本索引,使用?ensureIndex?函數(shù)。下面使用字母表集合中的?code?和?char?屬性創(chuàng)建一個(gè)索引。(參見(jiàn)清單 14)。
清單 14. 創(chuàng)建索引
| 1 2 | > db.alphabet.ensureIndex({code: 1}); > db.alphabet.ensureIndex({char: 1}); |
可以使用 dropIndex 和 dropIndexes 函數(shù)刪除索引。可參閱 MongoDB 文檔獲得更多信息。
排序
要對(duì)結(jié)果集進(jìn)行排序,可以對(duì)指針應(yīng)用 sort 函數(shù)。字母表集合已經(jīng)基于 code 和 char 屬性的升序排序,下面按 code 屬性的升序排序,返回一個(gè)子集:?> db.alphabet.find({code: {$gte: 118}}).sort({code: 0});。
這將返回清單 15?中的結(jié)果。
清單 15. 結(jié)果
| 1 2 3 4 5 | { "_id" : ObjectId("4cfa4adf528bad4e29beeca5"), "char" : "z", "code" : 122 } { "_id" : ObjectId("4cfa4adf528bad4e29beeca4"), "char" : "y", "code" : 121 } { "_id" : ObjectId("4cfa4adf528bad4e29beeca3"), "char" : "x", "code" : 120 } { "_id" : ObjectId("4cfa4adf528bad4e29beeca2"), "char" : "w", "code" : 119 } { "_id" : ObjectId("4cfa4adf528bad4e29beeca1"), "char" : "v", "code" : 118 } |
如果在上一條命令中為 sort 函數(shù)提供參數(shù)?{code: 1} ,它將會(huì)以升序?qū)Y(jié)果排序。為了確保高效的查詢,一定要為排序的數(shù)據(jù)屬性添加索引。
使用 skip 和 limit 分頁(yè)結(jié)果
通常在處理數(shù)據(jù)結(jié)果集時(shí),一次只想檢索一個(gè)子集,也許是在網(wǎng)頁(yè)上提供分頁(yè)結(jié)果。在 MySQL 中,您通常使用?LIMIT?關(guān)鍵字來(lái)實(shí)現(xiàn)。您在 MongoDB 中只需使用 skip 和 limit 函數(shù)即可實(shí)現(xiàn)這一功能。要返回字母表集合中的前 5 個(gè)文檔,可執(zhí)行以下操作:?> db.alphabet.find().limit(5);。
這將返回清單 16?中的結(jié)果。
清單 16. 結(jié)果
| 1 2 3 4 5 | { "_id" : ObjectId("4cfa4adf528bad4e29beec8c"), "char" : "a", "code" : 97 } { "_id" : ObjectId("4cfa4adf528bad4e29beec8d"), "char" : "b", "code" : 98 } { "_id" : ObjectId("4cfa4adf528bad4e29beec8e"), "char" : "c", "code" : 99 } { "_id" : ObjectId("4cfa4adf528bad4e29beec8f"), "char" : "d", "code" : 100 } { "_id" : ObjectId("4cfa4adf528bad4e29beec90"), "char" : "e", "code" : 101 } |
要獲得下一頁(yè),使用以下命令:?> db.alphabet.find().skip(5).limit(5);。
如清單 17?所示,這將獲取接下來(lái)的 5 條記錄。
清單 17. 獲取接下來(lái)的 5 條記錄
| 1 2 3 4 5 | { "_id" : ObjectId("4cfa4adf528bad4e29beec91"), "char" : "f", "code" : 102 } { "_id" : ObjectId("4cfa4adf528bad4e29beec92"), "char" : "g", "code" : 103 } { "_id" : ObjectId("4cfa4adf528bad4e29beec93"), "char" : "h", "code" : 104 } { "_id" : ObjectId("4cfa4adf528bad4e29beec94"), "char" : "i", "code" : 105 } { "_id" : ObjectId("4cfa4adf528bad4e29beec95"), "char" : "j", "code" : 106 } |
分組函數(shù)和聚合
MongoDB 的查詢引擎也使得對(duì)數(shù)據(jù)應(yīng)用聚合和分組函數(shù)變得非常簡(jiǎn)單。這類似于 SQL 中的相應(yīng)功能。可以說(shuō),應(yīng)用最廣泛的函數(shù)是 count() 函數(shù):> db.alphabet.find().count();。
這將返回 26。您可以簡(jiǎn)單對(duì)篩選出的查詢結(jié)果進(jìn)行計(jì)數(shù):?> db.alphabet.find({code: {$gte: 105}}).count();。
以上命令將返回 18。
另一個(gè)有用的聚合函數(shù)是?distinct。利用它可返回針對(duì)某個(gè)屬性的一組不同的值。由于所有數(shù)據(jù)都是唯一的,因此字母表集合不是一個(gè)合適的例子。我們向本文開(kāi)頭創(chuàng)建的?colors?集合中添加一些記錄(參見(jiàn)清單 18)。
清單 18. 向?color?集合中添加記錄
| 1 2 3 | > db.colors.save({name:"white",value:"FFFFFF"}); > db.colors.save({name:"red",value:"FF0000"});? > db.colors.find(); |
假定您沒(méi)有刪除?colors?集合,您將看到?清單 19?中的響應(yīng)。
清單 19. 響應(yīng)
| 1 2 3 | { "_id" : ObjectId("4cfa43ff528bad4e29beec57"), "name" : "red", "value" : "FF0000" } { "_id" : ObjectId("4cfa5830528bad4e29beeca8"), "name" : "white", "value" : "FFFFFF" } { "_id" : ObjectId("4cfa5839528bad4e29beeca9"), "name" : "red", "value" : "FF0000" } |
您可以看到,在這個(gè)集合中明顯有兩個(gè) red 文檔。現(xiàn)在使用?distinct?函數(shù)從此集合中獲得一組唯一的?name?屬性:?> db.colors.distinct("name");。
這將返回:?[ "red", "white" ]。
值得注意的是,您在執(zhí)行其他查詢函數(shù)時(shí)不能在指針和結(jié)果集上執(zhí)行 distinct 函數(shù),而應(yīng)直接在集合上執(zhí)行。還應(yīng)注意,它返回的不是一組文檔,而是一組值。
MongoDB 還為執(zhí)行類似于 SQL 中的?GROUP BY?表達(dá)式的操作提供了?group?函數(shù)。group?函數(shù)是一個(gè)異常復(fù)雜的函數(shù),所以我在這里只給出一個(gè)簡(jiǎn)短的示例。例如,我們要按 name 值來(lái)分組計(jì)算文檔數(shù)。在 SQL 中,可以定義表達(dá)式為?SELECT name, COUNT(*) FROM colors GROUP BY name;。
要在 MongoDB 中執(zhí)行此查詢,需要使用清單 20?中的命令。
清單 20. 使用?group?函數(shù)
| 1 2 3 4 5 6 | > db.colors.group( ... {key: {name: true}, ... cond: {}, ... initial: {count: 0},????????????????????????????????? ... reduce: function(doc, out) { out.count++; } ... }); |
這將產(chǎn)生在清單 21?中的結(jié)果。
清單 21. 結(jié)果
| 1 2 3 4 5 6 7 8 9 10 | [ ????{ ????????"name" : "red", ????????"count" : 2 ????}, ????{ ????????"name" : "white", ????????"count" : 1 ????} ] |
如果需要執(zhí)行高級(jí)聚合或使用大型數(shù)據(jù)集,MongoDB 還包含一個(gè)?map/reduce?實(shí)現(xiàn),讓您能夠完成這一任務(wù)。上面介紹的 group 函數(shù)在分片的 MongoDB 安裝中無(wú)法工作,所以如果您要使用分片,一定要使用?map/reduce?來(lái)替代 group 函數(shù)。
更新現(xiàn)有數(shù)據(jù)
在 MongoDB shell 中,更新文檔非常容易。在前面創(chuàng)建的 colors 集合中,有兩條?red?記錄。要從記錄中取出一個(gè)并將它更改為?black,且值屬性為?000000?(黑色的十六進(jìn)制值)。首先,可以使用 findOne 函數(shù)來(lái)檢索值為 red 的單個(gè)項(xiàng)目,根據(jù)需要更改其屬性,并將文檔存儲(chǔ)到數(shù)據(jù)庫(kù)中。
獲取名稱為?red?的單一文檔并把它存儲(chǔ)在?blackDoc?變量中:?> var blackDoc = db.colors.findOne({name: "red"});。
接下來(lái),使用點(diǎn)表示法修改文檔的屬性(參見(jiàn)清單 22)。
清單 22. 修改文檔屬性
| 1 2 | > blackDoc.name = "black"; > blackDoc.value = "000000"; |
在保存之前,檢查文檔是否正確(它應(yīng)該有?_id?屬性,否則只是插入了一條新記錄而不是覆蓋 red 記錄):?> printjson(blackDoc);。
如果返回結(jié)果類似于清單 23,則表示您準(zhǔn)備好了。
清單 23. 結(jié)果
| 1 2 3 4 5 | { ????"_id" : ObjectId("4cfa43ff528bad4e29beec57"), ????"name" : "black", ????"value" : "000000" } |
最后,使用?save?函數(shù)將文檔保存回?cái)?shù)據(jù)庫(kù)中的?colors?集合:?> db.colors.save(blackDoc);。
現(xiàn)在可以使用?find?函數(shù)來(lái)確保集合是正確的:?> db.colors.find();。
這將返回類似于清單 24?的結(jié)果。如果您有 4 條記錄,您就錯(cuò)了。
清單 24. 結(jié)果
| 1 2 3 | { "_id" : ObjectId("4cfa43ff528bad4e29beec57"), "name" : "black", "value" : "000000" } { "_id" : ObjectId("4cfa5830528bad4e29beeca8"), "name" : "white", "value" : "FFFFFF" } { "_id" : ObjectId("4cfa5839528bad4e29beeca9"), "name" : "red", "value" : "FF0000" } |
除了 Mongo shell 之外,您可以在應(yīng)用程序中使用 update 函數(shù)來(lái)將更改應(yīng)用到現(xiàn)有數(shù)據(jù)。有關(guān) update 函數(shù)的更多信息,請(qǐng)參閱 MongoDB 文檔。
刪除數(shù)據(jù)
要?jiǎng)h除 MongoDB 中的數(shù)據(jù),可使用?remove?函數(shù)。請(qǐng)注意這適用于 MongoDB shell 程序,某些驅(qū)動(dòng)程序可能使用 delete 函數(shù)或者沒(méi)有。如有必要,可查閱某個(gè)具體實(shí)現(xiàn)的相關(guān)文檔。
remove 函數(shù)與 find 函數(shù)工作方式類似。要?jiǎng)h除 colors 集合中與名稱?white?相匹配的任何文檔,可使用以下命令:?> db.colors.remove({name:"white"});。
然后,可以檢查此文檔是否已刪除:?> db.colors.find();。
如果正確,您將只會(huì)看見(jiàn)兩個(gè)文檔(參見(jiàn)清單 25)。
清單 25. 刪除數(shù)據(jù)
| 1 2 | { "_id" : ObjectId("4cfa43ff528bad4e29beec57"), "name" : "black", "value" : "000000" } { "_id" : ObjectId("4cfa5839528bad4e29beeca9"), "name" : "red", "value" : "FF0000" } |
要?jiǎng)h除集合中的所有文檔,只需在命令中省略篩選器,類似如下:?> db.colors.remove();。
現(xiàn)在如果您試圖使用 find 函數(shù),將得不到響應(yīng),表示一個(gè)空的結(jié)果集:?> db.colors.find();。
如果文檔存儲(chǔ)在變量中,也可以將此文檔傳送給?remove?函數(shù)以刪除它,但這么做非常低效。最好找到這個(gè)文檔的?_id?屬性并把它傳送給?remove?函數(shù)。
要?jiǎng)h除一個(gè)集合,使用以下命令:?> db.colors.drop();。
這將返回以下結(jié)果:?true。
現(xiàn)在可以使用?show collections?命令檢查集合確實(shí)已被刪除。這將產(chǎn)生清單 26?中的輸出。
清單 26. 使用?show collections?命令
| 1 2 | alphabet system.indexes |
最后,如果您想要?jiǎng)h除整個(gè)數(shù)據(jù)庫(kù),執(zhí)行如下命令:> db.dropDatabase();。
這將刪除當(dāng)前選定的數(shù)據(jù)庫(kù)。您將看到以下輸出:?{ "dropped" : "mymongo", "ok" : 1 }.
可以使用?show dbs?命令獲得可用數(shù)據(jù)庫(kù)列表。mymongo?將不會(huì)出現(xiàn)在這個(gè)列表中。
工具及其他特性
MongoDB 包含一系列用于管理數(shù)據(jù)庫(kù)的有用工具。無(wú)論是報(bào)表還是備份,它都提供了各種方式來(lái)導(dǎo)入和導(dǎo)出數(shù)據(jù)。在本節(jié)中,您將了解如何以 JSON 格式導(dǎo)入和導(dǎo)出文件,以及如何創(chuàng)建用于高效恢復(fù)的熱備份文件。您還將學(xué)習(xí)如何使用?map/reduce?函數(shù)作為 Mongo 用于復(fù)雜數(shù)據(jù)聚合的常規(guī)查詢函數(shù)的一種替代方式。
導(dǎo)入和導(dǎo)出數(shù)據(jù)
MongoDB 的 bin 目錄包含了一系列工具,可用于以各種格式導(dǎo)入和導(dǎo)出數(shù)據(jù)。 mongoimport 工具允許您提供一個(gè)文件,其中每行包含一個(gè) JSON 、CSV 或 TSV 格式的文檔,并將這些文檔插入 MongoDB 數(shù)據(jù)庫(kù)。由于 MongoDB 使用 BSON 格式,如果希望利用在常規(guī) JSON 中無(wú)法使用的 BSON 附加數(shù)據(jù)類型,在導(dǎo)入 JSON 文檔時(shí)需要提供一些說(shuō)明信息。
mongoexport 工具允許您生成一個(gè)文件輸出,其中 MongoDB 數(shù)據(jù)庫(kù)中的每個(gè)文檔都以 JSON 或 CSV 格式表示。這對(duì)于生成報(bào)表非常有用,因?yàn)閼?yīng)用程序接受 JSON 或 CSV 數(shù)據(jù)作為輸入。要生成一個(gè) CSV 文件,需要按輸出文件中顯示的順序提供字段。
備份和恢復(fù)數(shù)據(jù)庫(kù)
當(dāng)需要從 MongoDB 中取出數(shù)據(jù)以用于其他應(yīng)用程序或從其他使用 JSON 或 CSV 數(shù)據(jù)的應(yīng)用程序中導(dǎo)入數(shù)據(jù)時(shí),mongoimport 和 mongoexport 工具非常有用。然而,這些工具不能用于獲得定期備份或 MongoDB 數(shù)據(jù)庫(kù),也不能用于恢復(fù) MongoDB 數(shù)據(jù)庫(kù)。因?yàn)?MongoDB 使用 BSON 而不是 JSON 或 CSV ,從這些格式中導(dǎo)入數(shù)據(jù)時(shí)很難保留數(shù)據(jù)類型。
為了提供適當(dāng)?shù)膫浞莺突謴?fù)功能,MongoDB 提供了兩個(gè)工具:mongodump 和 mongorestore。 mongodump 用于生成數(shù)據(jù)庫(kù)的二進(jìn)制文件備份,mongorestore 用于讀取此文件并使用它恢復(fù)數(shù)據(jù)庫(kù),并根據(jù)需要自動(dòng)創(chuàng)建索引(除非已將 system.indexes.bson 文件從備份目錄中刪除)。
管理工具
MongoDB 還提供了一個(gè)基于 Web 的診斷接口,在默認(rèn) MongoDB 配置上從?http://localhost:28017/?可以獲得。這個(gè)屏幕類似于圖 2。
圖 2. MongoDB 診斷
為了獲得其他管理信息,也可以在 MongoDB shell 中運(yùn)行以下命令:
- db.serverStatus();
- db.stats();
如果 MongoDB 服務(wù)器崩潰,應(yīng)修復(fù)數(shù)據(jù)庫(kù)以檢查錯(cuò)誤并執(zhí)行一些數(shù)據(jù)精簡(jiǎn)。可以通過(guò)在操作系統(tǒng)命令行中運(yùn)行?mongod --repair?進(jìn)行修復(fù),或選擇從 MongoDB shell 運(yùn)行 db.repairDatabase() 命令。后一個(gè)命令在每個(gè)數(shù)據(jù)庫(kù)的級(jí)別上運(yùn)行,所以您需要針對(duì)服務(wù)器上的每個(gè)數(shù)據(jù)庫(kù)都運(yùn)行此命令。
您也可以使用 validate 函數(shù)驗(yàn)證集合數(shù)據(jù)。如果擁有一個(gè)名為 contacts 的集合,可以用?db.contacts.validate() 命令驗(yàn)證此集合。
MongoDB 有很多其他特性可讓數(shù)據(jù)庫(kù)管理員更輕松,包括各種各樣的第三方管理工具和可用的接口。請(qǐng)參閱 MongoDB 文檔以獲得更多信息。
map/reduce 函數(shù)
如果您以前使用過(guò) CouchDB 數(shù)據(jù)庫(kù),可能熟悉?map/reduce?函數(shù),因?yàn)橐晥D引擎默認(rèn)使用?map/reduce?函數(shù)來(lái)篩選和聚合數(shù)據(jù)。在 MongoDB 中,情況不是這樣的,簡(jiǎn)單的查詢和篩選(甚至聚合)不依靠?map/reduce?來(lái)完成。不過(guò),MongoDB 確實(shí)為聚合大型數(shù)據(jù)集的應(yīng)用提供了?map/reduce?實(shí)現(xiàn)。
map/reduce?這一主題可能需要一整篇文章來(lái)描述。有關(guān) MongoDB 實(shí)現(xiàn)的詳細(xì)信息,請(qǐng)參閱 MongoDB 文檔。(參見(jiàn)參考資料中的鏈接)。
擴(kuò)展 MongoDB
鍵/值存儲(chǔ)和面向文檔數(shù)據(jù)庫(kù)最近流行的主要原因是它們占用資源少及其高度可擴(kuò)展性。為了發(fā)揮這些優(yōu)勢(shì),MongoDB 引入了分片和復(fù)制的概念,您將在本節(jié)中學(xué)習(xí)。此外,您還將學(xué)習(xí)如何在 MongoDB 中使用 GridFS 存儲(chǔ)大文件。最后,您將了解如何對(duì)查詢進(jìn)行分析以優(yōu)化數(shù)據(jù)庫(kù)的性能。
分片
數(shù)據(jù)庫(kù)基礎(chǔ)架構(gòu)的一個(gè)重要部分就是確保其良好的可擴(kuò)展性。MongoDB 實(shí)現(xiàn)采用一種自動(dòng)分片機(jī)制來(lái)確保其橫向擴(kuò)展,這使得 MongoDB 配置可擴(kuò)展至數(shù)千個(gè)節(jié)點(diǎn),具有自動(dòng)負(fù)載平衡、無(wú)單點(diǎn)故障和自動(dòng)故障轉(zhuǎn)移功能,向 MongoDB 集群添加新機(jī)器也非常簡(jiǎn)單。
MongoDB 的自動(dòng)分片特性的好處是它使得從單一服務(wù)器轉(zhuǎn)向分片集群變得非常容易,通過(guò)無(wú)需或很少需要對(duì)所需的程序代碼進(jìn)行改動(dòng)。有關(guān)自動(dòng)分片的工作原理及如何實(shí)現(xiàn)它的詳細(xì)信息,請(qǐng)參閱 MongoDB 文檔。
復(fù)制
為了實(shí)現(xiàn)故障轉(zhuǎn)移和冗余,MongoDB 在主從配置中提供了復(fù)制特性(類似于 MySQL),從而確保節(jié)點(diǎn)之間的高度一致性。也就是說(shuō),MongoDB 可以在任何時(shí)候使用副本集將某個(gè)節(jié)點(diǎn)定義為主節(jié)點(diǎn),在故障時(shí)另一節(jié)點(diǎn)擔(dān)負(fù)起主節(jié)點(diǎn)的任務(wù)。
與 CouchDB 使用復(fù)制作為擴(kuò)展機(jī)制的思路不同,MongoDB 主要使用復(fù)制來(lái)確保高度可用性,方法是使用從屬節(jié)點(diǎn)作為冗余副本。
有關(guān) MongoDB 復(fù)制的更多信息,請(qǐng)參閱文檔(參見(jiàn)參考資料中的鏈接)。
使用 GridFS 的大文件存儲(chǔ)
MongoDB 數(shù)據(jù)庫(kù)以 BSON 文檔存儲(chǔ)數(shù)據(jù)。BSON 文檔的最大大小是 4MB,這不適合存儲(chǔ)大文件和對(duì)象。MongoDB 通過(guò)將文件劃分為多個(gè)文檔之間的較小塊,使用 GridFS 規(guī)范來(lái)存儲(chǔ)大文件。
標(biāo)準(zhǔn) MongoDB 發(fā)行版包含將 GridFS 文件添加到本地文件系統(tǒng)以及從本地文件系統(tǒng)檢索 GridFS 文件的命令行工具。另外,所有官方 MongoDB API 驅(qū)動(dòng)程序都包含對(duì) GridFS 的支持。有關(guān)詳細(xì)信息,請(qǐng)參閱 MongoDB 文檔(參見(jiàn)參考資料)。
結(jié)束語(yǔ)
在本文中,您學(xué)習(xí)了 MongoDB 數(shù)據(jù)庫(kù)管理系統(tǒng),以及它成為 DBMS 市場(chǎng)受歡迎的 NoSQL 中成長(zhǎng)最快的可選產(chǎn)品的原因。您學(xué)習(xí)了為何要選擇優(yōu)于傳統(tǒng) RDBMS 的面向文檔數(shù)據(jù)庫(kù),以及 MongoDB 提供的各種強(qiáng)大功能。還學(xué)習(xí)了如何安裝和使用 MongoDB 來(lái)存儲(chǔ)和檢索數(shù)據(jù),以及它提供的各種工具和可擴(kuò)展性選項(xiàng)。
相關(guān)主題
- 訪問(wèn)?MongoDB 官方網(wǎng)站。
- 閱讀 Wikipedia 的?MongoDB?條目。
- 訪問(wèn)?MongoDB 正式文檔。
- 了解有關(guān) MongoDB?map/reduce?函數(shù)的更多信息。
- MongoDB 手冊(cè)為正確使用 MongoDB 提供了指南。
- 通過(guò) developerWorks 網(wǎng)站學(xué)習(xí)使用 NoSQL 和分析大數(shù)據(jù)。
- 閱讀?MongoDB 生產(chǎn)部署的說(shuō)明,了解企業(yè)如何從 MySQL 轉(zhuǎn)換到 MongoDB。
- 閱讀?MongoDB 思考,了解業(yè)界觀念如何轉(zhuǎn)變。
- 閱讀博客使用 MongoDB 12 個(gè)月,了解 Wordnik 如何轉(zhuǎn)換到 MongoDB。
- 關(guān)注 Eltot Horowitz(10gen 的 CTO,10gen 是贊助 MongoDB 的一家公司)有關(guān) MongoDB 的博客。
- 10gen?開(kāi)發(fā)并支持 MongoDB,一個(gè)開(kāi)源、高性能、可擴(kuò)展、面向文檔的數(shù)據(jù)庫(kù)。
- Java 開(kāi)發(fā) 2.0:MongoDB:擁有 RDBMS 特性的 NoSQL 數(shù)據(jù)存儲(chǔ)(Andrew Glover,developerWorks,2010 年 9 月):了解所有關(guān)于 MongoDB 的自定義 API、交互式 shell、RDBMS 式的動(dòng)態(tài)查詢,以及快速簡(jiǎn)單的 MapReduce 計(jì)算的更多信息。
- 探索 CouchDB(Joe Lennon,developerWorks,2009 年 3 月): Apache 的開(kāi)源 CouchDB 提供了存儲(chǔ)數(shù)據(jù)的新方法,稱為無(wú)模式面向文檔的數(shù)據(jù)庫(kù)模型。不同于關(guān)系模型的高度結(jié)構(gòu)化的數(shù)據(jù)存儲(chǔ)方式,CouchDB 以半結(jié)構(gòu)化方式存儲(chǔ)數(shù)據(jù),使用基于 JavaScript 的視圖模型來(lái)從這些半結(jié)構(gòu)化的文檔生成結(jié)構(gòu)化的聚合和報(bào)表結(jié)果。
- 下載?MongoDB。
- 隨時(shí)關(guān)注 developerWorks?技術(shù)活動(dòng)和網(wǎng)絡(luò)廣播。
- 訪問(wèn) developerWorks?Open source 專區(qū)獲得豐富的 how-to 信息、工具和項(xiàng)目更新以及最受歡迎的文章和教程,幫助您用開(kāi)放源碼技術(shù)進(jìn)行開(kāi)發(fā),并將它們與 IBM 產(chǎn)品結(jié)合使用。
轉(zhuǎn)載于:https://www.cnblogs.com/davidwang456/articles/10974351.html
總結(jié)
以上是生活随笔為你收集整理的探索 MongoDB--转的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: MongoDB如何一次插入多条json数
- 下一篇: 瓜子大数据架构