MongoDB 是由 C++語言編寫的,是一個基於分佈式文件存儲的開源數據庫系統。 再高負載的狀況下,添加更多的節點,能夠保證服務器性能。 MongoDB 旨在給 WEB 應用提供可擴展的高性能數據存儲解決方案。javascript
MongoDB 將數據存儲爲一個文檔,數據結構由鍵值(key=>value)對組成。 MongoDB 文檔相似於 JSON 對象。字段值能夠包含其餘文檔,數組及文檔數組。java
(1)MongoDB 是一個面向文檔存儲的數據庫,操做起來比較簡單和容易。c++
(2)你能夠在 MongoDB 記錄中設置任何屬性的索引 (如: FirstName="Sameer",Address="8 Gandhi Road")來實現更快的排序。程序員
(3)你能夠經過本地或者網絡建立數據鏡像,這使得 MongoDB 有更強的擴展性。面試
(4)若是負載的增長(須要更多的存儲空間和更強的處理能力) ,它能夠分佈在計算機網絡中的其餘節點上這就是所謂的分片。正則表達式
(5)Mongo 支持豐富的查詢表達式。查詢指令使用 JSON 形式的標記,可輕易查詢文檔中內嵌的對象及數組。mongodb
(6)MongoDb 使用 update()命令能夠實現替換完成的文檔(數據)或者一些指定的數據字段 。數據庫
(7)Mongodb 中的 Map/reduce 主要是用來對數據進行批量處理和聚合操做。編程
(8)Map 和 Reduce。 Map 函數調用 emit(key,value)遍歷集合中全部的記錄,將 key 與 value 傳給 Reduce 函數進行處理。json
(9)Map 函數和 Reduce 函數是使用 Javascript 編寫的,並能夠經過 db.runCommand 或 mapreduce 命令來執行 MapReduce 操做。
(10)GridFS 是 MongoDB 中的一個內置功能,能夠用於存放大量小文件。
(11) MongoDB 容許在服務端執行腳本, 能夠用 Javascript 編寫某個函數,直接在服務端執行,也能夠把函數的定義存儲在服務端,下次直接調用便可。
NoSQL是非關係型數據庫,NoSQL = Not Only SQL。
關係型數據庫採用的結構化的數據,NoSQL採用的是鍵值對的方式存儲數據。
在處理非結構化/半結構化的大數據時;在水平方向上進行擴展時;隨時應對動態增長的數據項時能夠優先考慮使用NoSQL數據庫。
再考慮數據庫的成熟度;支持;分析和商業智能;管理及專業性等問題時,應優先考慮關係型數據庫。
NoSQL數據庫的類型
例如:MongoDB, Cassandra, CouchDB, Hypertable, Redis, Riak, HBASE, Memcache
MySQL和MongoDB二者都是免費開源的數據庫。MySQL和MongoDB有許多基本差異包括數據的表示(data representation),查詢,關係,事務,schema的設計和定義,標準化(normalization),速度和性能。
經過比較MySQL和MongoDB,實際上咱們是在比較關係型和非關係型數據庫,即數據存儲結構不一樣。
MongoDB和CouchDB都是面向文檔的數據庫。MongoDB和CouchDB都是開源NoSQL數據庫的最典型表明。 除了都以文檔形式存儲外它
們沒有其餘的共同點。MongoDB和CouchDB在數據模型實現、接口、對象存儲以及複製方法等方面有不少不一樣。
如下特色使得MongoDB成爲最好的NoSQL數據庫:
每一個journal (group)的寫操做都是一致的,除非它是完整的不然在恢復過程當中它不會回放。
MongoDB中包括了一個能夠顯示數據庫中每一個操做性能特色的數據庫分析器。經過這個分析器你能夠找到比預期慢的查詢(或寫操做);利用這一信息,好比,能夠肯定是否須要添加索引。
MongoDB存儲BSON對象在叢集(collection)中。數據庫名字和叢集名字以句點連結起來叫作名字空間(namespace)。
是的,用戶移除屬性而後對象會從新保存(re-save())。
是的。
對於對象成員而言,是的。然而用戶不可以添加空值(null)到數據庫叢集(collection)由於空值不是對象。然而用戶可以添加空對象{}。
不會,磁盤寫操做默認是延遲執行的。寫操做可能在兩三秒(默認在60秒內)後到達磁盤。例如,若是一秒內數據庫收到一千個對一個對象遞增的操做,僅刷新磁盤一次。(注意,儘管fsync選項在命令行和通過getLastError_old是有效的)
MongoDB沒有使用傳統的鎖或者複雜的帶回滾的事務,由於它設計的宗旨是輕量,快速以及可預計的高性能。能夠把它類比成MySQLMylSAM的自動提交模式。經過精簡對事務的支持,性能獲得了提高,特別是在一個可能會穿過多個服務器的系統裏。
MongoDB會積極的預分配預留空間來防止文件系統碎片。
從備份數據庫聲明主數據庫宕機到選出一個備份數據庫做爲新的主數據庫將花費10到30秒時間。這期間在主數據庫上的操做將會失敗--包括
寫入和強一致性讀取(strong consistent read)操做。然而,你還能在第二數據庫上執行最終一致性查詢(eventually consistent query)(在slaveOk模式下),即便在這段時間裏。
它是當前備份集羣(replica set)中負責處理全部寫入操做的主要節點/成員。在一個備份集羣中,當失效備援(failover)事件發生時,一個另外的成員會變成primary。
Seconday從當前的primary上覆制相應的操做。它是經過跟蹤複製oplog(local.oplog.rs)作到的。
不用。無論你有沒有調用getLastError(又叫"Safe Mode")服務器作的操做都同樣。調用getLastError只是爲了確認寫操做成功提交了。固然,你常常想獲得確認,可是寫操做的安全性和是否生效不是由這個決定的。
爲開發便捷起見,咱們建議以非集羣分片(unsharded)方式開始一個 MongoDB 環境,除非一臺服務器不足以存放你的初始數據集。從非集羣分片升級到集羣分片(sharding)是無縫的,因此在你的數據集還不是很大的時候不必考慮集羣分片(sharding)。
每個分片(shard)是一個分區數據的邏輯集合。分片可能由單一服務器或者集羣組成,咱們推薦爲每個分片(shard)使用集羣。
MongoDB 分片是基於區域(range)的。因此一個集合(collection)中的全部的對象都被存放到一個塊(chunk)中。只有當存在多餘一個塊的時後,纔會有多個分片獲取數據的選項。如今,每一個默認塊的大小是 64Mb,因此你須要至少 64 Mb 空間才能夠實施一個遷移。
更新操做會當即發生在舊的分片(shard)上,而後更改纔會在全部權轉移(ownership transfers)前複製到新的分片上。
若是一個分片(shard)中止了,除非查詢設置了「Partial」選項,不然查詢會返回一個錯誤。若是一個分片(shard)響應很慢,MongoDB則會等待它的響應。
沒問題,這些文件是在分片(shard)進行均衡操做(balancing)的時候產生的臨時文件。一旦這些操做已經完成,相關的臨時文件也應該被刪除掉。但目前清理工做是須要手動的,因此請當心地考慮再釋放這些文件的空間。
db._adminCommand("connPoolStats");
不須要,移動操做是一致(consistent)而且是肯定性的(deterministic);一次失敗後,移動操做會不斷重試;當完成後,數據只會出如今新的分片裏(shard)。
能夠。
更新操做會當即發生在舊的塊(Chunk)上,而後更改纔會在全部權轉移前複製到新的分片上。
不會,只會在A:{B,C}上使用索引。
若是一個分片中止了,除非查詢設置了「Partial」選項,不然查詢會返回一個錯誤。若是一個分片響應很慢,MongoDB會等待它的響應。
MongoDB支持存儲過程,它是javascript寫的,保存在db.system.js表中。
GridFS是一種將大型文件存儲在MongoDB中的文件規範。使用GridFS能夠將大文件分隔成多個小文檔存放,這樣咱們可以有效的保存大文檔,並且解決了BSON對象有限制的問題。
NoSQL是非關係型數據庫,NoSQL = Not Only SQL。
關係型數據庫採用的結構化的數據,NoSQL採用的是鍵值對的方式存儲數據。
在處理非結構化/半結構化的大數據時;在水平方向上進行擴展時;隨時應對動態增長的數據項時能夠優先考慮使用NoSQL數據庫。
在考慮數據庫的成熟度;支持;分析和商業智能;管理及專業性等問題時,應優先考慮關係型數據庫。
MongoDB支持存儲過程,它是javascript寫的,保存在db.system.js表中。
GridFS是一種將大型文件存儲在MongoDB中的文件規範。使用GridFS能夠將大文件分隔成多個小文檔存放,這樣咱們可以有效的保存大文檔,並且解決了BSON對象有限制的問題。
MongoDB採用的預分配空間的方式來防止文件碎片。
更新操做會當即發生在舊的塊(Chunk)上,而後更改纔會在全部權轉移前複製到新的分片上。
不會,只會在A:{B,C}上使用索引。
若是一個分片中止了,除非查詢設置了「Partial」選項,不然查詢會返回一個錯誤。若是一個分片響應很慢,MongoDB會等待它的響應。
分析器就是explain 顯示每次操做性能特色的數據庫分析器。經過分析器可能查找比預期慢的操做
是的,用戶移除屬性而後對象會從新保存(re-save())。
是的
通常磁盤的寫操做都是延遲執行的
由於mongodb設計就是輕量高性能,因此沒有傳統的鎖和複雜的事務的回滾
當前備份集羣負責全部的寫入操做的主要節點,在集羣中,當主節點(master)失效,另外一個成員會變爲master
調用getLastError 能夠確認當前的寫操做是否成功的提交
分片多是單一的服務器或者集羣組成,推薦使用集羣
mongodb分片是基於區域的,因此一個集合的全部對象都放置在同一個塊中,只有當存在多餘一個塊的時候,纔會有多個分片獲取數據的選項
會當即更新舊的分片,而後更改纔會在全部權轉移前複製到新的分片上
db._adminCommand("connPoolStats");複製代碼
數據庫中存儲的對象設計bson,一種相似json的二進制文件,由鍵值對組成
鍵值對–》文檔–》集合–》數據庫
MongoDB用c++編寫的,流行的開源數據庫MySQL也是用C++開發的。C++1983年發行是一種使用普遍的計算機程序設計語言。它是一種痛用程序設計語言,支持 多種編程模式。
集合就是一組 MongoDB 文檔。它至關於關係型數據庫(RDBMS)中的表這種概念。集合位於單獨的一個數據庫中。一個集合內的多個文檔能夠有多個不一樣的字段。通常來講,集合中的文檔都有着相同或相關的目的。
文檔由一組key value組成。文檔是動態模式,這意味着同一集合裏的文檔不須要有相同的字段和結構。在關係型數據庫中table中的每一條記錄至關於MongoDB中的一個文檔。
mongod是處理MongoDB系統的主要進程。它處理數據請求,管理數據存儲,和執行後臺管理操做。當咱們運行mongod命令意味着正在啓動MongoDB進程,而且在後臺運行。
它是一個命令行工具用於鏈接一個特定的mongod實例。當咱們沒有帶參數運行mongo命令它將使用默認的端口號和localhost鏈接
MongoDB 用 use +數據庫名稱的方式來建立數據庫。 use 會建立一個新的數據庫,若是該數據庫存在,則返回這個數據庫。
非關係型數據庫是對不一樣於傳統關係型數據庫的統稱。非關係型數據庫的顯著特色是不使用SQL做爲查詢語言,數據存儲不須要特定的表格模式。因爲簡單的設計和很是好的性能因此被用於大數據和Web Apps等
MongoDB內部有預分配空間的機制,每一個預分配的文件都用0進行填充。
數據文件每新分配一次,它的大小都是上一個數據文件大小的2倍,每一個數據文件最大2G。
MongoDB每一個集合和每一個索引都對應一個命名空間,這些命名空間的元數據集中在16M的*.ns文件中,平均每一個命名佔用約 628 字節,也即整個數據庫的命名空間的上限約爲24000。
若是每一個集合有一個索引(好比默認的_id索引),那麼最多能夠建立12000個集合。若是索引數更多,則可建立的集合數就更少了。同時,若是集合數太多,一些操做也會變慢。
要創建更多的集合的話,MongoDB 也是支持的,只須要在啓動時加上「--nssize」參數,這樣對應數據庫的命名空間文件就能夠變得更大以便保存更多的命名。這個命名空間文件(.ns文件)最大能夠爲 2G。
每一個命名空間對應的盤區不必定是連續的。與數據文件增加相同,每一個命名空間對應的盤區大小都是隨分配次數不斷增加的。目的是爲了平衡命名空間浪費的空間與保持一個命名空間數據的連續性。
須要注意的一個命名空間$freelist,這個命名空間用於記錄再也不使用的盤區(被刪除的Collection或索引)。每當命名空間須要分配新盤區時,會先查看$freelist是否有大小合適的盤區可使用,若是有就回收空閒的磁盤空間。
C、C++、C#、Java、Node.js、Perl、Php 等
MongoDB 用 use + 數據庫名稱 的方式來建立數據庫。 use 會建立一個新的數據庫,若是該數據庫存在,則返回這個數據庫。
使用命令"show dbs"
分片是將數據水平切分到不一樣的物理節點。當應用數據愈來愈大的時候,數據量也會愈來愈大。當數據量增加時,單臺機器有可能沒法存儲數據或可接受的讀取寫入吞吐量。利用分片技術能夠添加更多的機器來應對數據量增長以及讀寫操做的要求。
使用命令"db.adminCommand(「connPoolStats」)"
>db.adminCommand(「connPoolStats」)複製代碼
複製是將數據同步到多個服務器的過程,經過多個數據副本存儲到多個服務器上增長數據可用性。複製能夠保障數據的安全性,災難恢復,無需停機維護(如備份,重建索引,壓縮),分佈式讀取數據。
要想將數據插入 MongoDB 集合中,須要使用 insert() 或 save() 方法。
>db.collectionName.insert({"key":"value"})
>db.collectionName.save({"key":"value"})複製代碼
MongoDB 的 dropDatabase() 命令用於刪除已有數據庫。
>db.dropDatabase()複製代碼
在 MongoDB 中,建立集合採用db.createCollection(name, options)方法。 options 是一個用來指定集合配置的文檔。
>db.createCollection("collectionName")db.createCollection() - MongoDB Manual>db.createCollection("複製代碼
可使用show collections 查看當前數據庫中的全部集合清單
>show collections複製代碼
MongoDB 利用 db.collection.drop() 來刪除數據庫中的集合。
>db.CollectionName.drop()複製代碼
數據庫分析工具(Database Profiler)會針對正在運行的mongod實例收集數據庫命令執行的相關信息。包括增刪改查的命令以及配置和管理命令。分析器(profiler)會寫入全部收集的數據到 system.profile集合,一個capped集合在管理員數據庫。分析器默認是關閉的你能經過per數據庫或per實例開啓。
默認MongoDB不支持主鍵和外鍵關係。 用Mongodb自己的API須要硬編碼才能實現外鍵關聯,不夠直觀且難度較大。
String、Integer、Double、Boolean、Object、Object ID、Arrays、Min/Max Keys、Datetime、Code、Regular Expression等
"Code"類型用於在文檔中存儲 JavaScript 代碼。
"Regular Expression"類型用於在文檔中存儲正則表達式
"ObjectID"數據類型用於存儲文檔id
要想將數據插入 MongoDB 集合中,須要使用insert()或save()方法。
>db.collectionName.insert({"key":"value"})
>db.collectionName.save({"key":"value"})複製代碼
一共有四部分組成:時間戳、客戶端ID、客戶進程ID、三個字節的增量計數器
_id是一個 12 字節長的十六進制數,它保證了每個文檔的惟一性。在插入文檔時,須要提供 _id 。若是你不提供,那麼 MongoDB 就會爲每一文檔提供一個惟一的 id。 _id 的頭 4 個字節表明的是當前的時間戳,接着的後 3 個字節表示的是機器 id 號,接着的 2 個字節表示MongoDB 服務器進程 id,最後的 3 個字節表明遞增值。
索引用於高效的執行查詢.沒有索引MongoDB將掃描查詢整個集合中的全部文檔這種掃描效率很低,須要處理大量數據。索引是一種特殊的數據結構,將一小塊數據集保存爲容易遍歷的形式。索引可以存儲某種特殊字段或字段集的值,並按照索引指定的方式將字段值進行排序。
使用 db.collection.createIndex() 在集合中建立一個索引
>db.collectionName.createIndex({columnName:1})複製代碼
使用pretty() 方法能夠格式化顯示結果
>db.collectionName.find().pretty()複製代碼
在 find() 方法中,若是傳入多個鍵,並用逗號( , )分隔它們,那麼 MongoDB 會把它當作是AND條件。
>db.mycol.find({key1:value1, key2:value2}).pretty()複製代碼
若基於OR條件來查詢文檔,可使用關鍵字$or。
>db.mycol.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
).pretty()複製代碼
update() 與 save() 方法都能用於更新集合中的文檔。 update() 方法更新已有文檔中的值,而 save() 方法則是用傳入該方法的文檔來替換已有文檔。
MongoDB 利用 remove() 方法 清除集合中的文檔。它有 2 個可選參數:
>db.collectionName.remove({key:value})複製代碼
MongoDB 中的文檔排序是經過 sort() 方法來實現的。 sort() 方法能夠經過一些參數來指定要進行排序的字段,並使用 1 和 -1 來指定排
序方式,其中 1 表示升序,而 -1 表示降序。
>db.connectionName.find({key:value}).sort({columnName:1})複製代碼
聚合操做可以處理數據記錄並返回計算結果。聚合操做能將多個文檔中的值組合起來,對成組數據執行各類操做,返回單一的結果。它至關於 SQL 中的 count(*) 組合 group by。對於 MongoDB 中的聚合操做,應該使用 aggregate() 方法。
>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)複製代碼
在MongoDB中副本集由一組MongoDB實例組成,包括一個主節點多個次節點,MongoDB客戶端的全部數據都寫入主節點(Primary),副節點從主節點同步寫入數據,以保持全部複製集內存儲相同的數據,提升數據可用性。
歡迎關注公衆號:程序員追風,回覆 003 領取一套200頁的2020最新的Java面試題手冊。