快2020年了,趕忙收藏起MongoDB面試題輕鬆面對BAT靈魂式的拷問

關注公衆號【Ccww筆記】,獲取乾貨資料java

  MongoDB是基於分佈式文件存儲的數據庫,由C++語言編寫。旨在爲WEB應用提供可擴展的高性能數據存儲解決方案,且MongodDB是一個介於關係數據庫與非關係數據庫之間的產品,是非關係型數據庫中功能最豐富,最像關係數據庫。mysql

  因爲MongoDB的特性以及功能,使得其在企業使用頻率很大,因此不少面試都會MongoDB的相關知識,基於網上以及本身閱讀官網文檔總結2019-2020年MongoDB的面試題。具體以下:linux

1Q: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存儲引擎數據庫

2Q: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 用於內嵌文檔

3Q:什麼是集合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

4Q:什麼是」Mongod「,以及MongoDB命令。

  mongod是處理MongoDB系統的主要進程。它處理數據請求,管理數據存儲,和執行後臺管理操做。當咱們運行mongod命令意味着正在啓動MongoDB進程,而且在後臺運行。

MongoDB命令:

命令 說明
use database_name 切換數據庫
db.myCollection.find().pretty() 格式化打印結果
db.getCollection(collectionName).find() 修改Collection名稱

5Q:"Mongod"默認參數有?

  • 傳遞數據庫存儲路徑,默認是"/data/db"
  • 端口號 默認是 "27017"

6Q:MySQLmongodb的區別

形式 MongoDB MySQL
數據庫模型 非關係型 關係型
存儲方式 虛擬內存+持久化
查詢語句 獨特的MongoDB查詢方式 傳統SQL語句
架構特色 副本集以及分片 常見單點、M-S、MHA、MMM等架構方式
數據處理方式 基於內存,將熱數據存在物理內存中,從而達到高速讀寫 不一樣的引擎擁有本身的特色
使用場景 事件的記錄,內容管理或者博客平臺等數據大且非結構化數據的場景 適用於數據量少且不少結構化數據

​7Q:問mongodbredis區別以及選擇緣由

形式 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支持動態查詢。

  • 容易調試

  • 容易擴展

  • 不須要轉化/映射應用對象到數據庫對象

  • 使用內部內存做爲存儲工做區,以便更快的存取數據。

8Q:如何執行事務/加鎖?

  mongodb沒有使用傳統的鎖或者複雜的帶回滾的事務,由於它設計的宗旨是輕量,快速以及可預計的高性能.能夠把它類比成mysql mylsam的自動提交模式.經過精簡對事務的支持,性能獲得了提高,特別是在一個可能會穿過多個服務器的系統裏.

9Q:更新操做會馬上fsync到磁盤?

  不會,磁盤寫操做默認是延遲執行的.寫操做可能在兩三秒(默認在60秒內)後到達磁盤,經過 syncPeriodSecs 啓動參數,能夠進行配置.例如,若是一秒內數據庫收到一千個對一個對象遞增的操做,僅刷新磁盤一次.

MongoDB索引

10Q: 索引類型有哪些?

  • 單字段索引(Single Field Indexes)
  • 複合索引(Compound Indexes)
  • 多鍵索引(Multikey Indexes)
  • 全文索引(text Indexes)
  • Hash 索引(Hash Indexes)
  • 通配符索引(Wildcard Index)
  • 2dsphere索引(2dsphere Indexes)

11Q:MongoDB在A:{B,C}上創建索引,查詢A:{B,C}和A:{C,B}都會使用索引嗎?

 因爲MongoDB索引使用B-tree樹原理,只會在A:{B,C}上使用索引

MongoDB索引詳情可看文章MongoDB系列--輕鬆應對面試中遇到的MongonDB索引(index)問題其中包括不少索引的問題:

  • 建立索引,須要考慮的問題
  • 索引限制問題
  • 索引類型詳細解析
  • 索引的種類問題

12Q:什麼是聚合

  聚合操做可以處理數據記錄並返回計算結果。聚合操做能將多個文檔中的值組合起來,對成組數據執行各類操做,返回單一的結果。它至關於 SQL 中的 count(*) 組合 group by。對於 MongoDB 中的聚合操做,應該使用aggregate()方法。

詳情可查看文章MongoDB系列--深刻理解MongoDB聚合(Aggregation)其中包括不少聚合的問題:

  • 聚合管道(aggregation pipeline)的問題
  • Aggregation Pipeline 優化等問題
  • Map-Reduce函數的問題

MongoDB分片

13Q:monogodb 中的分片sharding

  分片sharding是將數據水平切分到不一樣的物理節點。當應用數據愈來愈大的時候,數據量也會愈來愈大。當數據量增加 時,單臺機器有可能沒法存儲數據或可接受的讀取寫入吞吐量。利用分片技術能夠添加更多的機器來應對數據量增長 以及讀寫操做的要求。

14Q:分片(Shard)和複製(replication)是怎樣工做的?

 每個分片(shard)是一個分區數據的邏輯集合。分片可能由單一服務器或者集羣組成,咱們推薦爲每個分片(shard)使用集羣。

15Q:若是塊移動操做(moveChunk)失敗了,我須要手動清除部分轉移的文檔嗎?

 不須要,移動操做是一致(consistent)而且是肯定性的(deterministic)。

  • 一次失敗後,移動操做會不斷重試。
  • 當完成後,數據只會出如今新的分片裏(shard)

16Q:數據在何時纔會擴展到多個分片(Shard)裏?

MongoDB 分片是基於區域(range)的。因此一個集合(collection)中的全部的對象都被存放到一個塊(chunk)中,默認塊的大小是 64Mb。當數據容量超過64 Mb,纔有可能實施一個遷移,只有當存在不止一個塊的時候,纔會有多個分片獲取數據的選項。

17Q:更新一個正在被遷移的塊(Chunk)上的文檔時會發生什麼?

 更新操做會當即發生在舊的塊(Chunk)上,而後更改纔會在全部權轉移前複製到新的分片上。

18Q:若是一個分片(Shard)中止或很慢的時候,發起一個查詢會怎樣?

若是一個分片中止了,除非查詢設置了 「Partial」 選項,不然查詢會返回一個錯誤。若是一個分片響應很慢,MongoDB 會等待它的響應。

MongoDB複製集

19Q:MongoDB副本集實現高可用的原理

MongoDB 使用了其複製(Replica Set)方案,實現自動容錯機制爲高可用提供了基礎。目前,MongoDB 支持兩種複製模式:

  • Master / Slave ,主從複製,角色包括 MasterSlave
  • Replica Set ,複製集複製,角色包括 PrimarySecondary 以及 Arbiter 。(生產環境必選)

20Q:什麼是masterprimary

 副本集只能有一個主節點可以確認寫入操做來接收全部寫操做,並記錄其操做日誌中的數據集的全部更改(記錄在oplog中)。在集羣中,當主節點(master)失效,Secondary節點會變爲master

21Q:什麼是SlaveSecondary

 複製主節點的oplog並將oplog記錄的操做應用於其數據集,若是主節點宕機了,將從符合條件的從節點選舉選出新的主節點。

22Q:什麼是Arbiter

 仲裁節點不維護數據集。 仲裁節點的目的是經過響應其餘副本集節點的心跳和選舉請求來維護副本集中的仲裁

23Q:複製集節點類型有哪些?

  • 優先級0型(Priority 0)節點
  • 隱藏型(Hidden)節點
  • 延遲型(Delayed)節點
  • 投票型(Vote)節點以及不可投票節點

24Q:啓用備份故障恢復須要多久?

  從備份數據庫聲明主數據庫宕機到選出一個備份數據庫做爲新的主數據庫將花費10到30秒時間.這期間在主數據庫上的操做將會失敗–包括寫入和強一致性讀取(strong consistent read)操做.然而,你還能在第二數據庫上執行最終一致性查詢(eventually consistent query)(在slaveok模式下),即便在這段時間裏.

MongoDB複製詳解分析可查看文章MongoDB系列-解決面試中可能遇到的MongoDB複製集(replica set)問題

25Q:raft選舉過程,投票規則?

選舉過程:

  當系統啓動好以後,初始選舉後系統由1個Leader和若干個Follower角色組成。而後忽然因爲某個異常緣由,Leader服務出現了異常,致使Follower角色檢測到和Leader的上次RPC更新時間超過給定閾值時間時。此時Follower會認爲Leader服務已出現異常,而後它將會發起一次新的Leader選舉行爲,同時將自身的狀態從Follower切換爲Candidate身份。隨後請求其它Follower投票選擇本身。

投票規則:

  • 當一個候選人得到了同一個任期號內的大多數選票,就成爲領導人。
  • 每一個節點最多在一個任期內投出一張選票。而且按照先來先服務的原則。
  • 一旦候選人贏得選舉,馬上成爲領導,併發送心跳維持權威,同時阻止新領導人的誕生

可查看文章通俗易懂的Paxos算法-基於消息傳遞的一致性算法

26Q:在哪些場景使用MongoDB?

規則: 若是業務中存在大量複雜的事務邏輯操做,則不要用MongoDB數據庫;在處理非結構化 / 半結構化的大數據使用MongoDB,操做的數據類型爲動態時也使用MongoDB,好比:

  • 內容管理系統,切面數據、日誌記錄
  • 移動端AppsO2O送快遞騎手、快遞商家的信息(包含位置信息)
  • 數據管理,監控數據

最後可關注公衆號【Ccww筆記】,一塊兒學習,天天會分享乾貨,還有學習視頻乾貨領取!

相關文章
相關標籤/搜索