基本概念
MongoDB**是一種面向文檔的資料庫管理系統,由C++語言編寫的,是一個基于分布式檔案存儲的開源資料庫系統。2007年10月,MongoDB由10gen團隊所發展。2009年2月首度推出。在高負載的情況下,添加更多的節點,可以保證伺服器性能。MongoDB 旨在為WEB應用提供可擴充的高性能資料存儲解決方案。MongoDB 将資料存儲為一個文檔,資料結構由鍵值(key=>value)對組成。MongoDB 文檔類似于 JSON 對象。字段值可以包含其他文檔,數組及文檔數組。
優缺點
優點
文檔結構的存儲方式,能夠更便捷的擷取資料
内置GridFS,支援大容量的存儲:GridFS是一個出色的分布式檔案系統,可以支援海量的資料存儲。 内置了GridFS了MongoDB,能夠滿足對大資料集的快速範圍查詢。
海量資料下,性能優越:在使用場合下,千萬級别的文檔對象,近10G的資料,對有索引的ID的查詢不會比mysql慢,而對非索引字段的查詢,則是全面勝出。 mysql實際無法勝任大資料量下任意字段的查詢,而mongodb的查詢性能實在讓我驚訝。寫入性能同樣很令人滿意。
動态查詢
全索引支援,擴充到内部對象和内嵌數組:索引通常能夠極大的提高查詢的效率,如果沒有索引,MongoDB在讀取資料時必須掃描集合中的每個檔案并選取那些符合查詢條件的記錄。這種掃描全集合的查詢效率是非常低的,特别在處理大量的資料時,查詢可以要花費幾十秒甚至幾分鐘,這對網站的性能是非常緻命的。索引是特殊的資料結構,索引存儲在一個易于周遊讀取的資料集合中,索引是對資料庫表中一列或多列的值進行排序的一種結構。
查詢記錄分析
快速,就地更新
高效存儲二進制大對象 (比如照片和視訊)
複制(複制集)和支援自動故障恢複
内置 Auto- Sharding 自動分片支援雲級擴充性,分片簡單
MapReduce 支援複雜聚合:主要用于處理資料(諸如統計平均值,求和等),并傳回計算後的資料結果。有點類似sql語句中的 count(*)。
商業支援,教育訓練和咨詢
缺點
不支援事務操作:事務要求嚴格的系統(如果銀行系統)肯定不能用它。
MongoDB沒有如MySQL那樣成熟的維護工具
無法進行關聯表查詢,不适用于關系多的資料
複雜聚合操作通過mapreduce建立,速度慢
模式自由,自由靈活的檔案存儲格式帶來的資料錯
MongoDB 在你删除記錄後不會在檔案系統回收空間。除非你删掉資料庫。但是空間沒有被浪費
關系型資料庫遵循ACID

分布式計算優缺點
NoSQL:not only SQL優缺點
NoSQL資料庫分類
MongoDB:C++語言編寫,開源,高負載添加節點保證伺服器性能。将資料存儲為文檔,于分布式檔案存儲的資料庫。下載下傳位址:http://www.mongodb.org/downloads
MongoDB啟動參數
配置MongoDB
解壓下載下傳https://www.mongodb.com/download-center/community的ZIP包,并更改檔案名為mongodb,在其同目錄下建立檔案夾data和data\db,log和mongo.log。
打開cmd 進入cd mongodb\bin,執行下面指令啟動網絡:
最後,再次打開cmd 進入cd mongodb\bin,執行下面指令:mongo
在浏覽器中打開位址:
MongoDB概念解析
資料庫指令
"show dbs" 指令顯示所有資料的清單。
"db" 指令顯示目前資料庫對象或集合
"use"指令,可以連接配接到一個指定的資料庫。
資料庫命名規範
文檔(行):文檔是一個鍵值(key-value)對(即BSON)。MongoDB 的文檔不需要設定相同的字段,并且相同的字段不需要相同的資料類型,這與關系型資料庫有很大的差別,也是 MongoDB 非常突出的特點。
集合(表):集合就是 MongoDB 文檔組,類似于 RDBMS (關系資料庫管理系統:Relational Database Management System)中的表格。
資料類型
mongodb連接配接
使用者名和密碼連接配接到MongoDB,'username:password@hostname/dbname'
建立資料庫 use DATABASE_NAME
插入資料:
删除資料庫: db.dropDatabase()
删除集合 db.collection.drop()
插入文檔 : db.COLLECTION_NAME.insert(document)
更新文檔: db.collection.update( criteria, objNew, upsert, multi )
查找文檔 db.userdetails.find(),find() 方法以非結構化的方式來顯示所有文檔。還有一個 findOne() 方法,它隻傳回一個文檔。
易懂的讀取pretty(),
删除文檔 remove() 方法,
MongoDB 與 RDBMS Where 語句比較
MongoDB AND條件:MongoDB 的 find() 方法可以傳入多個鍵(key),每個鍵(key)以逗号隔開,及正常 SQL 的 AND 條件。文法格式如下:
OR查詢條件:MongoDB OR 條件語句使用了關鍵字 $or,文法格式如下:
$type操作符:操作符是基于BSON類型來檢索集合中比對的資料類型,并傳回結果。
limit與skip,limit()方法接受一個數字參數,該參數指定從MongoDB中讀取的記錄條數。
skip()方法來跳過指定數量的資料,skip方法同樣接受一個數字參數作為跳過的記錄條數。
排序:sort()方法可以通過參數指定排序的字段,并使用 1 和 -1 來指定排序的方式,其中 1 為升序排列,而-1是用于降序排列。
索引: ensureIndex() 方法來建立索引。文法中 Key 值為你要建立的索引字段,1為指定按升序建立索引,如果你想按降序來建立索引指定為-1即可。
聚合:處理資料(諸如統計平均值,求和等),并傳回計算後的資料結果。有點類似sql語句中的 count(*)。聚合的方法使用aggregate()。
管道
複制,複制是将資料同步在多個伺服器的過程。複制提供了資料的備援備份,并在多個伺服器上存儲資料副本,提高了資料的可用性, 并可以保證資料的安全性。複制還允許您從硬體故障和服務中斷中恢複資料。
以上執行個體會啟動一個名為rs0的MongoDB執行個體,其端口号為27017。
啟動後打開指令提示框并連接配接上mongoDB服務。
在Mongo用戶端使用指令rs.initiate()來啟動一個新的副本集。
我們可以使用rs.conf()來檢視副本集的配置
檢視副本集姿态使用 rs.status() 指令
MongoDB分片,另一種叢集,就是分片技術,可以滿足MongoDB資料量大量增長的需求。當MongoDB存儲海量的資料時,一台機器可能不足以存儲資料也足以提供可接受的讀寫吞吐量。就可以通過在多台機器上分割資料,使得資料庫系統能存儲和處理更多的資料。
分片執行個體
MongoDB資料備份:mongodbdump
使用mongodump指令來備份MongoDB資料。該指令可以導出所有資料到指定目錄中。mongodump指令可以通過參數指定導出的資料量級轉存的伺服器。
、
MongoDB資料恢複,mongodbstore
MongoDB監控
mongostat 和 mongotop 兩個指令來監控MongoDB的運作情況。
環境配置,在Java程式中如果要使用MongoDB,你需要確定已經安裝了Java環境及MongoDB JDBC 驅動。
首先你必須下載下傳mongo jar包,下載下傳位址:https://github.com/mongodb/mongo-java-driver/downloads, 請確定下載下傳最新版本。
你需要将mongo.jar包含在你的 classpath 中。。
連接配接資料庫,你需要指定資料庫名稱,如果指定的資料庫不存在,mongo會自動建立資料庫。
使用com.mongodb.DB類中的createCollection()來建立集合
使用com.mongodb.DBCollection類的 getCollection() 方法來擷取一個集合
使用com.mongodb.DBCollection類的 insert() 方法來插入一個文檔
使用com.mongodb.DBCollection類中的 find() 方法來擷取集合中的所有文檔。
使用 com.mongodb.DBCollection 類中的 update() 方法來更新集合中的文檔
使用com.mongodb.DBCollection類中的 findOne()方法來擷取第一個文檔,然後使用remove 方法删除
MongoDB 的關系表示多個文檔之間在邏輯上的互相聯系。文檔間可以通過嵌入和引用來建立聯系。MongoDB 中的關系可以是:
1:1 (1對1)
1: N (1對多)
N: 1 (多對1)
N: N (多對多)
一個使用者可以有多個位址,是以是一對多的關系。
使用嵌入式方法,我們可以把使用者位址嵌入到使用者的文檔中
資料儲存在單一文檔中,比較容易的擷取很維護資料。 你可以這樣查詢使用者的位址:
這種資料結構的缺點是,如果使用者和使用者位址在不斷增加,資料量不斷變大,會影響讀寫性能。
引用式關系,把使用者資料文檔和使用者位址資料文檔分開,通過引用文檔的 id 字段來建立關系。
需要兩次查詢,第一次查詢使用者位址的對象id(ObjectId),第二次通過查詢的id擷取使用者的詳細位址資訊。
使用MapReduce
全文檢索,MongoDB 在 2.6 版本以後是預設開啟全文檢索的
建立全文索引
考慮以下 posts 集合的文檔資料,包含了文章内容(post_text)及标簽(tags):
我們可以對 post_text 字段建立全文索引,這樣我們可以搜尋文章内的内容:
使用全文索引
現在我們已經對 post_text 建立了全文索引,我們可以搜尋文章中的關鍵詞w3cschool.cn:
以下指令傳回了如下包含NoSQL關鍵詞的文檔資料:
删除已存在的全文索引,可以使用 find 指令查找索引名:
通過以上指令擷取索引名,本例的索引名為post_text_text,執行以下指令來删除索引:
使用 $regex 操作符來設定比對字元串的正規表達式。
使用正規表達式,使用正則查找包含 w3cschool.cn 字元串的文章:
以上查詢也可以寫為:
不區分大小寫的正規表達式
如果檢索需要不區分大小寫,我們可以設定 $options 為 $i。以下指令将查找不區分大小寫的字元串 w3cschool.cn:
集合中會傳回所有包含字元串 w3cschool.cn 的資料,且不區分大小寫:
數組元素使用正規表達式
這在标簽的實作上非常有用,如果你需要查找包含以 tutorial 開頭的标簽資料(tutorial 或 tutorials 或 tutorialpoint 或 tutorialphp), 你可以使用以下代碼:
優化正規表達式查詢
如果你的文檔中字段設定了索引,那麼使用索引相比于正規表達式比對查找所有的資料查詢速度更快。
如果正規表達式是字首表達式,所有比對的資料将以指定的字首字元串為開始。例如: 如果正規表達式為^tut ,查詢語句将查找以 tut 為開頭的字元串。
GridFS 用于存儲和恢複那些超過16M(BSON檔案限制)的檔案(如:圖檔、音頻、視訊等)。也是檔案存儲的一種方式,但是它是存儲在MonoDB的集合中。GridFS 會将大檔案對象分割成多個小的chunk(檔案片段),一般為256k/個,每個chunk将作為MongoDB的一個文檔(document)被存儲在chunks集合中。
GridFS 用兩個集合來存儲一個檔案:fs.files與fs.chunks。每個檔案的實際内容被存在chunks(二進制資料)中,和檔案有關的meta資料(filename,content_type,還有使用者自定義的屬性)将會被存在files集合中。
以下是簡單的 fs.files 集合文檔:
以下是簡單的 fs.chunks 集合文檔:
GridFS 添加檔案
現在我們使用 GridFS 的 put 指令來存儲 mp3 檔案。 調用 MongoDB 安裝目錄下bin的 mongofiles.exe工具。
打開指令提示符,進入到MongoDB的安裝目錄的bin目錄中,找到mongofiles.exe,并輸入下面的代碼:
GridFS 是存儲檔案的資料名稱。如果不存在該資料庫,MongoDB會自動建立。Song.mp3 是音頻檔案名。使用以下指令來檢視資料庫中檔案的文檔:
以上指令執行後傳回以下文檔資料:
我們可以看到 fs.chunks 集合中所有的區塊,以下我們得到了檔案的 _id 值,我們可以根據這個 _id 擷取區塊(chunk)的資料:
以上執行個體中,查詢傳回了 40 個文檔的資料,意味着mp3檔案被存儲在40個區塊中。
MongoDB 沒有像 SQL 一樣有自動增長的功能, MongoDB 的id是系統自動生成的12位元組唯一辨別。但在某些情況下,我們可能需要實作 ObjectId 自動增長功能。由于 MongoDB 沒有實作這個功能,我們可以通過程式設計的方式來實作,以下我們将在 counters 集合中實作id字段自動增長。
使用集合
以下 products 文檔。id 字段實作 從 1,2,3,4 到 n 的自動增長功能。
為此,建立 counters 集合,序列字段值可以實作自動長:
向 counters 集合中插入以下文檔,使用 productid 作為 key:
sequence_value 字段是序列通過自動增長後的一個值。使用以下指令插入 counters 集合的序列文檔中:
建立 Javascript 函數
建立函數 getNextSequenceValue 來作為序列名的輸入, 指定的序列會自動增長 1 并傳回最新序列值。在本文的執行個體中序列名為 productid 。
使用 Javascript 函數
使用 getNextSequenceValue 函數建立一個新的文檔, 并設定文檔 _id 自動為傳回的序列值:
使用 getNextSequenceValue 函數來設定 _id 字段。為了驗證函數是否有效,我們可以使用以下指令讀取文檔:
以上指令将傳回以下結果,我們發現 _id 字段是自增長的:
作者:白甯超,工學碩士,現工作于四川省計算機研究院,研究方向是自然語言處理和機器學習。曾參與國家自然基金項目和四川省科技支撐計劃等多個省級項目。著有《自然語言處理理論與實戰》一書。 自然語言處理與機器學習技術交流群号:436303759 。
出處:http://www.cnblogs.com/baiboy/
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。