關注公衆號【Ccww筆記】,獲取乾貨資料
java
MongoDB
是基於分佈式文件存儲的數據庫,由C++
語言編寫。旨在爲WEB
應用提供可擴展的高性能數據存儲解決方案,且MongodDB
是一個介於關係數據庫與非關係數據庫之間的產品,是非關係型數據庫中功能最豐富,最像關係數據庫。mysql
因爲MongoDB
的特性以及功能,使得其在企業使用頻率很大,因此不少面試都會MongoDB的相關知識,基於網上以及本身閱讀官網文檔總結2019-2020年MongoDB
的面試題。具體以下:linux
MongoDB
的優點有哪些?面向集合(Collection
)和文檔(document
)的存儲,以JSON格式的文檔保存數據。面試
高性能,支持Document
中嵌入Document
減小了數據庫系統上的I/O操做以及具備完整的索引支持,支持快速查詢正則表達式
高效的傳統存儲方式:支持二進制數據及大型對象redis
高可用性,數據複製集,MongoDB 數據庫支持服務器之間的數據複製來提供自動故障轉移(automatic failover
)算法
高可擴展性,分片(sharding
)將數據分佈在多個數據中心,MongoDB支持基於分片鍵建立數據區域.sql
豐富的查詢功能, 聚合管道(Aggregation Pipeline
)、全文搜索(Text Search
)以及地理空間查詢(Geospatial Queries
)mongodb
支持多個存儲引擎,WiredTiger存儲引、In-Memory存儲引擎數據庫
MongoDB
支持哪些數據類型?java相似數據類型:
類型 | 解析 |
---|---|
String |
字符串。存儲數據經常使用的數據類型。在 MongoDB 中,UTF-8 編碼的字符串纔是合法的 |
Integer |
整型數值。用於存儲數值。根據你所採用的服務器,可分爲 32 位或 64 位 |
Double |
雙精度浮點值。用於存儲浮點值 |
Boolean |
布爾值。用於存儲布爾值(真/假) |
Arrays |
用於將數組或列表或多個值存儲爲一個鍵 |
Datetime |
記錄文檔修改或添加的具體時間 |
MongoDB特有數據類型:
類型 | 解析 |
---|---|
ObjectId |
用於存儲文檔 id ,ObjectId 是基於分佈式主鍵的實現MongoDB 分片也可繼續使用 |
Min/Max Keys |
將一個值與 BSON(二進制的 JSON)元素的最低值和最高值相對比 |
Code |
用於在文檔中存儲 JavaScript 代碼 |
Regular Expression |
用於在文檔中存儲正則表達式 |
Binary Data |
二進制數據。用於存儲二進制數據 |
Null |
用於建立空值 |
Object |
用於內嵌文檔 |
Collection
、文檔Document
,以及與關係型數據庫術語類比。Collection
位於單獨的一個數據庫MongoDB 文檔Document
集合,它相似關係型數據庫(RDBMS)中的表Table
。一個集合Collection
內的多個文檔Document
能夠有多個不一樣的字段。一般狀況下,集合Collection
中的文檔Document
有着相同含義。Document
由key-value構成。文檔Document
是動態模式,這說明同一集合裏的文檔不須要有相同的字段和結構。相似於關係型數據庫中table中的每一條記錄。mongodb | 關係型數據庫 |
---|---|
Database | Database |
Collection | Table |
Document | Record/Row |
Filed | Column |
Embedded Documents | Table join |
Mongod
「,以及MongoDB
命令。 mongod
是處理MongoDB
系統的主要進程。它處理數據請求,管理數據存儲,和執行後臺管理操做。當咱們運行mongod
命令意味着正在啓動MongoDB
進程,而且在後臺運行。
MongoDB
命令:
命令 | 說明 |
---|---|
use database_name | 切換數據庫 |
db.myCollection.find().pretty() | 格式化打印結果 |
db.getCollection(collectionName).find() | 修改Collection名稱 |
Mongod
"默認參數有?"/data/db"
MySQL
和mongodb
的區別形式 | MongoDB | MySQL |
---|---|---|
數據庫模型 | 非關係型 | 關係型 |
存儲方式 | 虛擬內存+持久化 | |
查詢語句 | 獨特的MongoDB查詢方式 | 傳統SQL語句 |
架構特色 | 副本集以及分片 | 常見單點、M-S、MHA、MMM等架構方式 |
數據處理方式 | 基於內存,將熱數據存在物理內存中,從而達到高速讀寫 | 不一樣的引擎擁有本身的特色 |
使用場景 | 事件的記錄,內容管理或者博客平臺等數據大且非結構化數據的場景 | 適用於數據量少且不少結構化數據 |
mongodb
和redis
區別以及選擇緣由形式 | MongoDB | redis |
---|---|---|
內存管理機制 | MongoDB 數據存在內存,由 linux系統 mmap 實現,當內存不夠時,只將熱點數據放入內存,其餘數據存在磁盤 | Redis 數據所有存在內存,按期寫入磁盤,當內存不夠時,能夠選擇指定的 LRU 算法刪除數據 |
支持的數據結構 | MongoDB 數據結構比較單一,可是支持豐富的數據表達,索引 | Redis 支持的數據結構豐富,包括hash、set、list等 |
性能 | mongodb依賴內存,TPS較高 | Redis依賴內存,TPS很是高。性能上Redis優於MongoDB |
可靠性 | 支持持久化以及複製集增長可靠性 | Redis依賴快照進行持久化;AOF加強可靠性;加強可靠性的同時,影響訪問性能 |
數據分析 | mongodb內置數據分析功能(mapreduce) | Redis不支持 |
事務支持狀況 | 只支持單文檔事務,須要復瑣事務支持的場景暫時不適合 | Redis 事務支持比較弱,只能保證事務中的每一個操做連續執行 |
集羣 | MongoDB 集羣技術比較成熟 | Redis從3.0開始支持集羣 |
選擇緣由:
架構簡單
沒有複雜的鏈接
深度查詢能力,MongoDB
支持動態查詢。
容易調試
容易擴展
不須要轉化/映射應用對象到數據庫對象
使用內部內存做爲存儲工做區,以便更快的存取數據。
mongodb
沒有使用傳統的鎖或者複雜的帶回滾的事務,由於它設計的宗旨是輕量,快速以及可預計的高性能.能夠把它類比成mysql mylsam
的自動提交模式.經過精簡對事務的支持,性能獲得了提高,特別是在一個可能會穿過多個服務器的系統裏.
不會,磁盤寫操做默認是延遲執行的.寫操做可能在兩三秒(默認在60秒內)後到達磁盤,經過 syncPeriodSecs
啓動參數,能夠進行配置.例如,若是一秒內數據庫收到一千個對一個對象遞增的操做,僅刷新磁盤一次.
10Q: 索引類型有哪些?
Single Field Indexes
)Compound Indexes
)Multikey Indexes
)text Indexes
)Hash Indexes
)Wildcard Index
)2dsphere Indexes
)11Q:MongoDB
在A:{B,C}上創建索引,查詢A:{B,C}和A:{C,B}都會使用索引嗎?
因爲MongoDB
索引使用B-tree
樹原理,只會在A:{B,C}上使用索引
MongoDB
索引詳情可看文章【MongoDB
系列--輕鬆應對面試中遇到的MongonDB索引(index)問題】,其中包括不少索引的問題:
聚合操做可以處理數據記錄並返回計算結果。聚合操做能將多個文檔中的值組合起來,對成組數據執行各類操做,返回單一的結果。它至關於 SQ
L 中的 count(*)
組合 group by
。對於 MongoDB
中的聚合操做,應該使用aggregate()
方法。
詳情可查看文章【MongoDB系列--深刻理解MongoDB聚合(Aggregation)】,其中包括不少聚合的問題:
aggregation pipeline
)的問題Aggregation Pipeline
優化等問題13Q:monogodb
中的分片sharding
分片sharding
是將數據水平切分到不一樣的物理節點。當應用數據愈來愈大的時候,數據量也會愈來愈大。當數據量增加 時,單臺機器有可能沒法存儲數據或可接受的讀取寫入吞吐量。利用分片技術能夠添加更多的機器來應對數據量增長 以及讀寫操做的要求。
14Q:分片(Shard
)和複製(replication
)是怎樣工做的?
每個分片(shard
)是一個分區數據的邏輯集合。分片可能由單一服務器或者集羣組成,咱們推薦爲每個分片(shard
)使用集羣。
15Q:若是塊移動操做(moveChunk
)失敗了,我須要手動清除部分轉移的文檔嗎?
不須要,移動操做是一致(consistent
)而且是肯定性的(deterministic
)。
16Q:數據在何時纔會擴展到多個分片(Shard
)裏?
MongoDB
分片是基於區域(range
)的。因此一個集合(collection
)中的全部的對象都被存放到一個塊(chunk
)中,默認塊的大小是 64Mb。當數據容量超過64 Mb,纔有可能實施一個遷移,只有當存在不止一個塊的時候,纔會有多個分片獲取數據的選項。
17Q:更新一個正在被遷移的塊(Chunk)上的文檔時會發生什麼?
更新操做會當即發生在舊的塊(Chunk)上,而後更改纔會在全部權轉移前複製到新的分片上。
18Q:若是一個分片(Shard)中止或很慢的時候,發起一個查詢會怎樣?
若是一個分片中止了,除非查詢設置了 「Partial
」 選項,不然查詢會返回一個錯誤。若是一個分片響應很慢,MongoDB
會等待它的響應。
19Q:MongoDB
副本集實現高可用的原理
MongoDB
使用了其複製(Replica Set
)方案,實現自動容錯機制爲高可用提供了基礎。目前,MongoDB
支持兩種複製模式:
Master
/ Slave
,主從複製,角色包括 Master
和 Slave
。Replica Set
,複製集複製,角色包括 Primary
和 Secondary
以及 Arbiter
。(生產環境必選)20Q:什麼是master
或primary
?
副本集只能有一個主節點可以確認寫入操做來接收全部寫操做,並記錄其操做日誌中的數據集的全部更改(記錄在oplog中)。在集羣中,當主節點(master
)失效,Secondary節點會變爲master
21Q:什麼是Slave
或Secondary
?
複製主節點的oplog並將oplog記錄的操做應用於其數據集,若是主節點宕機了,將從符合條件的從節點選舉選出新的主節點。
22Q:什麼是Arbiter
?
仲裁節點不維護數據集。 仲裁節點的目的是經過響應其餘副本集節點的心跳和選舉請求來維護副本集中的仲裁
23Q:複製集節點類型有哪些?
Priority 0
)節點Hidden
)節點Delayed
)節點Vote
)節點以及不可投票節點24Q:啓用備份故障恢復須要多久?
從備份數據庫聲明主數據庫宕機到選出一個備份數據庫做爲新的主數據庫將花費10到30秒時間.這期間在主數據庫上的操做將會失敗–包括寫入和強一致性讀取(strong consistent read
)操做.然而,你還能在第二數據庫上執行最終一致性查詢(eventually consistent query
)(在slaveok
模式下),即便在這段時間裏.
MongoDB
複製詳解分析可查看文章【MongoDB系列-解決面試中可能遇到的MongoDB複製集(replica set)問題】
raft
選舉過程,投票規則?選舉過程:
當系統啓動好以後,初始選舉後系統由1個Leader
和若干個Follower
角色組成。而後忽然因爲某個異常緣由,Leader
服務出現了異常,致使Follower
角色檢測到和Leader
的上次RPC更新時間超過給定閾值時間時。此時Followe
r會認爲Leader
服務已出現異常,而後它將會發起一次新的Leader
選舉行爲,同時將自身的狀態從Follower
切換爲Candidate
身份。隨後請求其它Follower
投票選擇本身。
投票規則:
可查看文章【通俗易懂的Paxos算法-基於消息傳遞的一致性算法】
MongoDB
?規則: 若是業務中存在大量複雜的事務邏輯操做,則不要用MongoDB
數據庫;在處理非結構化 / 半結構化的大數據使用MongoDB
,操做的數據類型爲動態時也使用MongoDB
,好比:
Apps
:O2O
送快遞騎手、快遞商家的信息(包含位置信息)最後可關注公衆號【Ccww筆記】,一塊兒學習,天天會分享乾貨,還有學習視頻乾貨領取!