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

MongoDB是基于分布式文件存儲(chǔ)的數(shù)據(jù)庫,由C++語言編寫。旨在為WEB應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案,且MongodDB是一個(gè)介于關(guān)系數(shù)據(jù)庫與非關(guān)系數(shù)據(jù)庫之間的產(chǎn)品,是非關(guān)系型數(shù)據(jù)庫中功能最豐富,最像關(guān)系數(shù)據(jù)庫。

由于MongoDB的特性以及功能,使得其在企業(yè)使用頻率很大,所以很多面試都會(huì)MongoDB的相關(guān)知識,基于網(wǎng)上以及自己閱讀官網(wǎng)文檔總結(jié)2019-2020年MongoDB的面試題。具體如下:

? 1Q:MongoDB的優(yōu)勢有哪些?

  • 面向集合(Collection)和文檔(document)的存儲(chǔ),以JSON格式的文檔保存數(shù)據(jù)。

  • 高性能,支持Document中嵌入Document減少了數(shù)據(jù)庫系統(tǒng)上的I/O操作以及具有完整的索引支持,支持快速查詢

  • 高效的傳統(tǒng)存儲(chǔ)方式:支持二進(jìn)制數(shù)據(jù)及大型對象

  • 高可用性,數(shù)據(jù)復(fù)制集,MongoDB 數(shù)據(jù)庫支持服務(wù)器之間的數(shù)據(jù)復(fù)制來提供自動(dòng)故障轉(zhuǎn)移(automatic failover

  • 高可擴(kuò)展性,分片(sharding)將數(shù)據(jù)分布在多個(gè)數(shù)據(jù)中心,MongoDB支持基于分片鍵創(chuàng)建數(shù)據(jù)區(qū)域.

  • 豐富的查詢功能, 聚合管道(Aggregation Pipeline)、全文搜索(Text Search)以及地理空間查詢(Geospatial Queries)

  • 支持多個(gè)存儲(chǔ)引擎,WiredTiger存儲(chǔ)引、In-Memory存儲(chǔ)引擎

? 2Q:MongoDB 支持哪些數(shù)據(jù)類型?

java類似數(shù)據(jù)類型:

類型 解析
String 字符串。存儲(chǔ)數(shù)據(jù)常用的數(shù)據(jù)類型。在 MongoDB 中,UTF-8 編碼的字符串才是合法的
Integer 整型數(shù)值。用于存儲(chǔ)數(shù)值。根據(jù)你所采用的服務(wù)器,可分為 32 位或 64 位
Double 雙精度浮點(diǎn)值。用于存儲(chǔ)浮點(diǎn)值
Boolean 布爾值。用于存儲(chǔ)布爾值(真/假)
Arrays 用于將數(shù)組或列表或多個(gè)值存儲(chǔ)為一個(gè)鍵
Datetime 記錄文檔修改或添加的具體時(shí)間

MongoDB特有數(shù)據(jù)類型:

類型 解析
ObjectId 用于存儲(chǔ)文檔 id,ObjectId是基于分布式主鍵的實(shí)現(xiàn)MongoDB分片也可繼續(xù)使用
Min/Max Keys 將一個(gè)值與 BSON(二進(jìn)制的 JSON)元素的最低值和最高值相對比
Code 用于在文檔中存儲(chǔ) JavaScript代碼
Regular Expression 用于在文檔中存儲(chǔ)正則表達(dá)式
Binary Data 二進(jìn)制數(shù)據(jù)。用于存儲(chǔ)二進(jìn)制數(shù)據(jù)
Null 用于創(chuàng)建空值
Object 用于內(nèi)嵌文檔

?3Q:什么是集合Collection、文檔Document,以及與關(guān)系型數(shù)據(jù)庫術(shù)語類比。

  • 集合Collection位于單獨(dú)的一個(gè)數(shù)據(jù)庫MongoDB 文檔Document集合,它類似關(guān)系型數(shù)據(jù)庫(RDBMS)中的表Table。一個(gè)集合Collection內(nèi)的多個(gè)文檔Document可以有多個(gè)不同的字段。通常情況下,集合Collection中的文檔Document有著相同含義。
  • 文檔Document由key-value構(gòu)成。文檔Document是動(dòng)態(tài)模式,這說明同一集合里的文檔不需要有相同的字段和結(jié)構(gòu)。類似于關(guān)系型數(shù)據(jù)庫中table中的每一條記錄。
  • 與關(guān)系型數(shù)據(jù)庫術(shù)語類比
mongodb 關(guān)系型數(shù)據(jù)庫
Database Database
Collection Table
Document Record/Row
Filed Column
Embedded Documents Table join

? 4Q:什么是”Mongod“,以及MongoDB命令。

mongod是處理MongoDB系統(tǒng)的主要進(jìn)程。它處理數(shù)據(jù)請求,管理數(shù)據(jù)存儲(chǔ),和執(zhí)行后臺(tái)管理操作。當(dāng)我們運(yùn)行mongod命令意味著正在啟動(dòng)MongoDB進(jìn)程,并且在后臺(tái)運(yùn)行。

MongoDB命令:

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

? 5Q:"Mongod"默認(rèn)參數(shù)有?

  • 傳遞數(shù)據(jù)庫存儲(chǔ)路徑,默認(rèn)是"/data/db"
  • 端口號 默認(rèn)是 "27017"

?6Q:MySQLmongodb的區(qū)別

形式 MongoDB MySQL
數(shù)據(jù)庫模型 非關(guān)系型 關(guān)系型
存儲(chǔ)方式 虛擬內(nèi)存+持久化
查詢語句 獨(dú)特的MongoDB查詢方式 傳統(tǒng)SQL語句
架構(gòu)特點(diǎn) 副本集以及分片 常見單點(diǎn)、M-S、MHA、MMM等架構(gòu)方式
數(shù)據(jù)處理方式 基于內(nèi)存,將熱數(shù)據(jù)存在物理內(nèi)存中,從而達(dá)到高速讀寫 不同的引擎擁有自己的特點(diǎn)
使用場景 事件的記錄,內(nèi)容管理或者博客平臺(tái)等數(shù)據(jù)大且非結(jié)構(gòu)化數(shù)據(jù)的場景 適用于數(shù)據(jù)量少且很多結(jié)構(gòu)化數(shù)據(jù)

?7Q:問mongodbredis區(qū)別以及選擇原因

形式 MongoDB redis
內(nèi)存管理機(jī)制 MongoDB 數(shù)據(jù)存在內(nèi)存,由 linux系統(tǒng) mmap 實(shí)現(xiàn),當(dāng)內(nèi)存不夠時(shí),只將熱點(diǎn)數(shù)據(jù)放入內(nèi)存,其他數(shù)據(jù)存在磁盤 Redis 數(shù)據(jù)全部存在內(nèi)存,定期寫入磁盤,當(dāng)內(nèi)存不夠時(shí),可以選擇指定的 LRU 算法刪除數(shù)據(jù)
支持的數(shù)據(jù)結(jié)構(gòu) MongoDB 數(shù)據(jù)結(jié)構(gòu)比較單一,但是支持豐富的數(shù)據(jù)表達(dá),索引 Redis 支持的數(shù)據(jù)結(jié)構(gòu)豐富,包括hash、set、list等
性能 mongodb依賴內(nèi)存,TPS較高 Redis依賴內(nèi)存,TPS非常高。性能上Redis優(yōu)于MongoDB
可靠性 支持持久化以及復(fù)制集增加可靠性 Redis依賴快照進(jìn)行持久化;AOF增強(qiáng)可靠性;增強(qiáng)可靠性的同時(shí),影響訪問性能
數(shù)據(jù)分析 mongodb內(nèi)置數(shù)據(jù)分析功能(mapreduce) Redis不支持
事務(wù)支持情況 只支持單文檔事務(wù),需要復(fù)雜事務(wù)支持的場景暫時(shí)不適合 Redis 事務(wù)支持比較弱,只能保證事務(wù)中的每個(gè)操作連續(xù)執(zhí)行
集群 MongoDB 集群技術(shù)比較成熟 Redis從3.0開始支持集群

選擇原因:

  • 架構(gòu)簡單

  • 沒有復(fù)雜的連接

  • 深度查詢能力,MongoDB支持動(dòng)態(tài)查詢。

  • 容易調(diào)試

  • 容易擴(kuò)展

  • 不需要轉(zhuǎn)化/映射應(yīng)用對象到數(shù)據(jù)庫對象

  • 使用內(nèi)部內(nèi)存作為存儲(chǔ)工作區(qū),以便更快的存取數(shù)據(jù)。

8Q:如何執(zhí)行事務(wù)/加鎖?

mongodb沒有使用傳統(tǒng)的鎖或者復(fù)雜的帶回滾的事務(wù),因?yàn)樗O(shè)計(jì)的宗旨是輕量,快速以及可預(yù)計(jì)的高性能.可以把它類比成mysql mylsam的自動(dòng)提交模式.通過精簡對事務(wù)的支持,性能得到了提升,特別是在一個(gè)可能會(huì)穿過多個(gè)服務(wù)器的系統(tǒng)里.

9Q:更新操作會(huì)立刻fsync到磁盤?

不會(huì),磁盤寫操作默認(rèn)是延遲執(zhí)行的.寫操作可能在兩三秒(默認(rèn)在60秒內(nèi))后到達(dá)磁盤,通過 syncPeriodSecs 啟動(dòng)參數(shù),可以進(jìn)行配置.例如,如果一秒內(nèi)數(shù)據(jù)庫收到一千個(gè)對一個(gè)對象遞增的操作,僅刷新磁盤一次.

MongoDB索引

10Q: 索引類型有哪些?

  • 單字段索引(Single Field Indexes)
  • 復(fù)合索引(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}都會(huì)使用索引嗎?

由于MongoDB索引使用B-tree樹原理,只會(huì)在A:{B,C}上使用索引

MongoDB索引詳情可看文章MongoDB系列--輕松應(yīng)對面試中遇到的MongonDB索引(index)問題,其中包括很多索引的問題:

  • 創(chuàng)建索引,需要考慮的問題
  • 索引限制問題
  • 索引類型詳細(xì)解析
  • 索引的種類問題

12Q:什么是聚合

聚合操作能夠處理數(shù)據(jù)記錄并返回計(jì)算結(jié)果。聚合操作能將多個(gè)文檔中的值組合起來,對成組數(shù)據(jù)執(zhí)行各種操作,返回單一的結(jié)果。它相當(dāng)于 SQL 中的 count(*) 組合 group by。對于 MongoDB 中的聚合操作,應(yīng)該使用aggregate()方法。

詳情可查看文章MongoDB系列--深入理解MongoDB聚合(Aggregation),其中包括很多聚合的問題:

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

MongoDB分片

13Q:monogodb 中的分片sharding

分片sharding是將數(shù)據(jù)水平切分到不同的物理節(jié)點(diǎn)。當(dāng)應(yīng)用數(shù)據(jù)越來越大的時(shí)候,數(shù)據(jù)量也會(huì)越來越大。當(dāng)數(shù)據(jù)量增長 時(shí),單臺(tái)機(jī)器有可能無法存儲(chǔ)數(shù)據(jù)或可接受的讀取寫入吞吐量。利用分片技術(shù)可以添加更多的機(jī)器來應(yīng)對數(shù)據(jù)量增加 以及讀寫操作的要求。

14Q:分片(Shard)和復(fù)制(replication)是怎樣工作的?

每一個(gè)分片(shard)是一個(gè)分區(qū)數(shù)據(jù)的邏輯集合。分片可能由單一服務(wù)器或者集群組成,我們推薦為每一個(gè)分片(shard)使用集群。

15Q:如果塊移動(dòng)操作(moveChunk)失敗了,我需要手動(dòng)清除部分轉(zhuǎn)移的文檔嗎?

不需要,移動(dòng)操作是一致(consistent)并且是確定性的(deterministic)。

  • 一次失敗后,移動(dòng)操作會(huì)不斷重試。
  • 當(dāng)完成后,數(shù)據(jù)只會(huì)出現(xiàn)在新的分片里(shard)

16Q:數(shù)據(jù)在什么時(shí)候才會(huì)擴(kuò)展到多個(gè)分片(Shard)里?

MongoDB 分片是基于區(qū)域(range)的。所以一個(gè)集合(collection)中的所有的對象都被存放到一個(gè)塊(chunk)中,默認(rèn)塊的大小是 64Mb。當(dāng)數(shù)據(jù)容量超過64 Mb,才有可能實(shí)施一個(gè)遷移,只有當(dāng)存在不止一個(gè)塊的時(shí)候,才會(huì)有多個(gè)分片獲取數(shù)據(jù)的選項(xiàng)。

17Q:更新一個(gè)正在被遷移的塊(Chunk)上的文檔時(shí)會(huì)發(fā)生什么?

更新操作會(huì)立即發(fā)生在舊的塊(Chunk)上,然后更改才會(huì)在所有權(quán)轉(zhuǎn)移前復(fù)制到新的分片上。

18Q:如果一個(gè)分片(Shard)停止或很慢的時(shí)候,發(fā)起一個(gè)查詢會(huì)怎樣?

如果一個(gè)分片停止了,除非查詢設(shè)置了 “Partial” 選項(xiàng),否則查詢會(huì)返回一個(gè)錯(cuò)誤。如果一個(gè)分片響應(yīng)很慢,MongoDB 會(huì)等待它的響應(yīng)。

MongoDB復(fù)制集

19Q:MongoDB副本集實(shí)現(xiàn)高可用的原理

MongoDB 使用了其復(fù)制(Replica Set)方案,實(shí)現(xiàn)自動(dòng)容錯(cuò)機(jī)制為高可用提供了基礎(chǔ)。目前,MongoDB 支持兩種復(fù)制模式:

  • Master / Slave ,主從復(fù)制,角色包括 MasterSlave
  • Replica Set ,復(fù)制集復(fù)制,角色包括 PrimarySecondary 以及 Arbiter 。(生產(chǎn)環(huán)境必選)

?20Q:什么是masterprimary?

副本集只能有一個(gè)主節(jié)點(diǎn)能夠確認(rèn)寫入操作來接收所有寫操作,并記錄其操作日志中的數(shù)據(jù)集的所有更改(記錄在oplog中)。在集群中,當(dāng)主節(jié)點(diǎn)(master)失效,Secondary節(jié)點(diǎn)會(huì)變?yōu)?code>master

21Q:什么是SlaveSecondary?

復(fù)制主節(jié)點(diǎn)的oplog并將oplog記錄的操作應(yīng)用于其數(shù)據(jù)集,如果主節(jié)點(diǎn)宕機(jī)了,將從符合條件的從節(jié)點(diǎn)選舉選出新的主節(jié)點(diǎn)。

22Q:什么是Arbiter

仲裁節(jié)點(diǎn)不維護(hù)數(shù)據(jù)集。 仲裁節(jié)點(diǎn)的目的是通過響應(yīng)其他副本集節(jié)點(diǎn)的心跳和選舉請求來維護(hù)副本集中的仲裁

23Q:復(fù)制集節(jié)點(diǎn)類型有哪些?

  • 優(yōu)先級0型(Priority 0)節(jié)點(diǎn)
  • 隱藏型(Hidden)節(jié)點(diǎn)
  • 延遲型(Delayed)節(jié)點(diǎn)
  • 投票型(Vote)節(jié)點(diǎn)以及不可投票節(jié)點(diǎn)

24Q:啟用備份故障恢復(fù)需要多久?

從備份數(shù)據(jù)庫聲明主數(shù)據(jù)庫宕機(jī)到選出一個(gè)備份數(shù)據(jù)庫作為新的主數(shù)據(jù)庫將花費(fèi)10到30秒時(shí)間.這期間在主數(shù)據(jù)庫上的操作將會(huì)失敗–包括寫入和強(qiáng)一致性讀取(strong consistent read)操作.然而,你還能在第二數(shù)據(jù)庫上執(zhí)行最終一致性查詢(eventually consistent query)(在slaveok模式下),即使在這段時(shí)間里.

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

25Q:raft選舉過程,投票規(guī)則?

選舉過程:

當(dāng)系統(tǒng)啟動(dòng)好之后,初始選舉后系統(tǒng)由1個(gè)Leader和若干個(gè)Follower角色組成。然后突然由于某個(gè)異常原因,Leader服務(wù)出現(xiàn)了異常,導(dǎo)致Follower角色檢測到和Leader的上次RPC更新時(shí)間超過給定閾值時(shí)間時(shí)。此時(shí)Follower會(huì)認(rèn)為Leader服務(wù)已出現(xiàn)異常,然后它將會(huì)發(fā)起一次新的Leader選舉行為,同時(shí)將自身的狀態(tài)從Follower切換為Candidate身份。隨后請求其它Follower投票選擇自己。

投票規(guī)則:

  • 當(dāng)一個(gè)候選人獲得了同一個(gè)任期號內(nèi)的大多數(shù)選票,就成為領(lǐng)導(dǎo)人。
  • 每個(gè)節(jié)點(diǎn)最多在一個(gè)任期內(nèi)投出一張選票。并且按照先來先服務(wù)的原則。
  • 一旦候選人贏得選舉,立刻成為領(lǐng)導(dǎo),并發(fā)送心跳維持權(quán)威,同時(shí)阻止新領(lǐng)導(dǎo)人的誕生

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

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

規(guī)則: 如果業(yè)務(wù)中存在大量復(fù)雜的事務(wù)邏輯操作,則不要用MongoDB數(shù)據(jù)庫;在處理非結(jié)構(gòu)化 / 半結(jié)構(gòu)化的大數(shù)據(jù)使用MongoDB,操作的數(shù)據(jù)類型為動(dòng)態(tài)時(shí)也使用MongoDB,比如:

  • 內(nèi)容管理系統(tǒng),切面數(shù)據(jù)、日志記錄
  • 移動(dòng)端AppsO2O送快遞騎手、快遞商家的信息(包含位置信息)
  • 數(shù)據(jù)管理,監(jiān)控?cái)?shù)據(jù)

作者:Ccww
鏈接:https://juejin.im/post/5d9ee1ce5188255820783df3
來源:掘金
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本文包括以下幾個(gè)方面: –安全措施 – 部署架構(gòu) – 系統(tǒng)優(yōu)化 – 索引設(shè)計(jì) – 備份監(jiān)控 – 模式設(shè)計(jì) – 程序...
    張偉科閱讀 4,236評論 0 9
  • NoSql數(shù)據(jù)庫優(yōu)缺點(diǎn) 在優(yōu)勢方面主要體現(xiàn)在下面幾點(diǎn): 簡單的擴(kuò)展 快速的讀寫 低廉的成本 靈活的數(shù)據(jù)模型 在不足...
    dreamer_lk閱讀 2,874評論 0 6
  • MongoDB 運(yùn)維實(shí)戰(zhàn)總結(jié) [TOC] 一、MongoDB 集群簡介 MongoDB是一個(gè)基于分布式文件存儲(chǔ)的數(shù)...
    浩瀚無邊_8704閱讀 4,709評論 0 7
  • 1.1 MongoDB復(fù)制集簡介 一組Mongodb復(fù)制集,就是一組mongod進(jìn)程,這些進(jìn)程維護(hù)同一個(gè)數(shù)據(jù)集合。...
    IT_小白閱讀 904評論 0 4
  • 蝸居閑室度昏晨, 靜對寵辱皆不驚。 他年常盼面目貴, 今朝倒怯腰腿疼。 樓頂日月天天過, 門前楊柳歲歲新。 隔壁頑...
    坦人閱讀 1,601評論 14 37

友情鏈接更多精彩內(nèi)容