手撸架构,MongDB 面试50问
| 技術棧 | 傳送門 |
| JAVA 基礎 | 手擼架構,Java基礎面試100問_vincent-CSDN博客 |
| JAVA 集合 | 手擼架構,JAVA集合面試60問_vincent-CSDN博客 |
| JVM 虛擬機 | 手擼架構,JVM面試30問_vincent-CSDN博客 |
| 并發編程 | 手擼架構,并發編程面試123問_vincent-CSDN博客 |
| Spring? | 手擼架構,Spring面試63問_vincent-CSDN博客 |
| Spring cloud? | 手擼架構,Spring cloud面試45問_vincent-CSDN博客 |
| SpringBoot | 手擼面試,Spring Boot面試41問_vincent-CSDN博客 |
| Netty 與 RPC | 手擼架構,Netty 與 RPC面試48問_vincent-CSDN博客 |
| Doubo? | 手擼架構,Dubbo面試49問_vincent-CSDN博客 |
| Redis | 手擼架構,Redis面試41問_vincent-CSDN博客 |
| Zookeeper | 手擼架構,Zookeeper面試27問_vincent-CSDN博客 |
| Mysql? | 手擼架構,Mysql 面試126問_vincent-CSDN博客 |
| MyBatis | 手擼架構,MyBatis面試42問_vincent-CSDN博客 |
| MongoDB? | 手擼架構,MongDB 面試50問_vincent-CSDN博客 |
| Elasticsearch | 手擼架構,Elasticsearch 面試25問_vincent-CSDN博客 |
| RabbitMQ? | 手擼架構,RabbitMQ 面試49問_vincent-CSDN博客 |
| Kafka? | 手擼架構,Kafka 面試42問_vincent-CSDN博客 |
| Docker | 手擼架構,Docker 面試25問_vincent-CSDN博客 |
| Nginx | 手擼架構,Nginx 面試40問_vincent-CSDN博客 |
| 算法 | 常用排序算法總結(1)-- 比較排序_vincent-CSDN博客_比較排序 常用排序算法總結(2)-- 非比較排序算法_vincent-CSDN博客_非比較排序的算法有 |
| 分布式事務 | 分布式事務解決方案(總覽)_vincent-CSDN博客 |
| HTTP | 太厲害了,終于有人能把TCP/IP 協議講的明明白白了_vincent-CSDN博客_tcp和ip |
什么是RDBMS?
關系數據庫管理系統(Relational Database Management System:RDBMS)是指包括相互聯系的邏輯組織和存取這些數據的一套程序 (數據庫管理系統軟件)。關系數據庫管理系統就是管理關系數據庫,并將數據邏輯組織的系統。
- 高度組織化結構化數據
- 結構化查詢語言(SQL) (SQL)
- 數據和關系都存儲在單獨的表中。
- 數據操縱語言,數據定義語言
- 嚴格的一致性
- 基礎事務
什么是NoSQL?
NoSQL,指的是非關系型的數據庫。NoSQL有時也稱作Not Only SQL的縮寫,是對不同于傳統的關系型數據庫的數據庫管理系統的統稱。
NoSQL用于超大規模數據的存儲。(例如谷歌或Facebook每天為他們的用戶收集萬億比特的數據)。這些類型的數據存儲不需要固定的模式,無需多余操作就可以橫向擴展。
- 代表著不僅僅是SQL
- 沒有聲明性查詢語言
- 沒有預定義的模式
- 鍵 - 值對存儲,列存儲,文檔存儲,圖形數據庫
- 最終一致性,而非ACID屬性
- 非結構化和不可預知的數據
- CAP定理
- 高性能,高可用性和可伸縮性
NoSQL的優點/缺點
優點:
- 高可擴展性
- 分布式計算
- 低成本
- 架構的靈活性,半結構化數據
- 沒有復雜的關系
缺點:
- 沒有標準化
- 有限的查詢功能(到目前為止)
- 最終一致是不直觀的程序
NoSQL的分類和典型的產品
- 鍵值(KV)存儲:Memcached、Redis
- 列存儲(column-oriented):HBASE(新浪,360)、Cassandra(200臺服務器集群)
- 文檔數據庫(document-oriented):MongoDB(最接近關系型數據庫的NoSQL)
- 圖形存儲(Graph):Neo4j
MongoDB簡介
MongoDB 是由 C++語言編寫的,是一個基于分布式文件存儲的開源數據庫系統。在高負載的情
況下,添加更多的節點,可以保證服務器性能。MongoDB 旨在為 WEB 應用提供可擴展的高性能
數據存儲解決方案。
MongoDB 將數據存儲為一個文檔,數據結構由鍵值(key=>value)對組成。MongoDB 文檔類似
于 JSON 對象。字段值可以包含其他文檔,數組及文檔數組
MongoDB 特點
- MongoDB 是一個面向文檔存儲的數據庫,操作起來比較簡單和容易。
- 在 MongoDB 記錄中設置任何屬性的索引 (如:FirstName="Sameer",Address="8 Gandhi Road")來實現更快的排序。
- 通過本地或者網絡創建數據鏡像,這使得 MongoDB 有更強的擴展性。
- 如果負載的增加(需要更多的存儲空間和更強的處理能力) ,它可以分布在計算機網絡中的其他節點上這就是所謂的分片。 · Mongo 支持豐富的查詢表達式。查詢指令使用 JSON 形式的標記,可輕易查詢文檔中內嵌的對象及數組。
- MongoDb 使用 update()命令可以實現替換完成的文檔(數據)或者一些指定的數據字段 。
- Mongodb 中的 Map/reduce 主要是用來對數據進行批量處理和聚合操作。
- Map 和 Reduce。Map 函數調用 emit(key,value)遍歷集合中所有的記錄,將 key 與 value 傳 給Reduce 函數進行處理。
- Map 函數和 Reduce 函數是使用 Javascript 編寫的,并可以通過 db.runCommand 或mapReduce 命令來執行 MapReduce 操作
- GridFS 是 MongoDB 中的一個內置功能,可以用于存放大量小文件。
- MongoDB 允許在服務端執行腳本,可以用 Javascript 編寫某個函數,直接在服務端執行,也可以把函數的定義存儲在服務端,下次直接調用即可
功能
- 面向集合的存儲:適合存儲對象及JSON形式的數據。
- 動態查詢:Mongo支持豐富的查詢表達式。查詢指令使用JSON形式的標記,可輕易查詢文檔中內嵌的對象及數組。
- 完整的索引支持:包括文檔內嵌對象及數組。Mongo的查詢優化器會分析查詢表達式,并生成一個高效的查詢計劃。
- 查詢監視:Mongo包含一個監視工具用于分析數據庫操作的性能。
- 復制及自動故障轉移:Mongo數據庫支持服務器之間的數據復制,支持主-從模式及服務器之間的相互復制。復制的主要目標是提供冗余及自動故障轉移。
- 高效的傳統存儲方式:支持二進制數據及大型對象(如照片或圖片)
- 自動分片以支持云級別的伸縮性:自動分片功能支持水平的數據庫集群,可動態添加額外的機器。
在哪些場景使用MongoDB
- 游戲場景,使用 MongoDB 存儲游戲用戶信息,用戶的裝備、積分等直接以內嵌文檔的形式存儲,方便查詢、更新
- 物流場景,使用 MongoDB 存儲訂單信息,訂單狀態在運送過程中會不斷更新,以 MongoDB 內嵌數組的形式來存儲,一次查詢就能將訂單所有的變更讀取出來。
- 社交場景,使用 MongoDB 存儲存儲用戶信息,以及用戶發表的朋友圈信息,通過地理位置索引實現附近的人、地點等功能
- 物聯網場景,使用 MongoDB 存儲所有接入的智能設備信息,以及設備匯報的日志信息,并對這些信息進行多維度的分析
- 視頻直播,使用 MongoDB 存儲用戶信息、禮物信息等
MongoDB要注意的問題
1 因為MongoDB是全索引的,所以它直接把索引放在內存中,因此最多支持2.5G的數據。如果是64位的會更多。
2 因為沒有恢復機制,因此要做好數據備份
3 因為默認監聽地址是127.0.0.1,因此要進行身份驗證,否則不夠安全;如果是自己使用,建議配置成localhost主機名
4 通過GetLastError確保變更。
數據庫的整體結構組成如下:
鍵值對–》文檔–》集合–》數據庫
MongoDB的文件單個大小不超過4M,但是新版本后可提升到16M
MongoDB中的key命名規則如下:
- '\0″不能使用
- 帶有'.'號,'_'號和'$'號前綴的Key被保留
- 大小寫有區別,Age不同于age
- 同一個文檔不能有相同的Key
- 除了上面幾條規則外,其他所有UTF-8字符都可以使用
基本指令
| database | database | 數據庫 |
| table | collection | 數據庫表/集合 |
| row | document | 數據記錄行/文檔 |
| column | field | 數據字段/域 |
| index | index | 索引 |
| table joins | 表連接,MongoDB不支持 | |
| primary key | primary key | 主鍵,MongoDB自動將_id字段設置為主鍵 |
1?.show dbs 顯示數據庫
2.show databases 顯示數據庫
3.第一次存放文檔時新建數據庫,無需新建
4.use xxx 切換到xxx數據庫
5.show collections 顯示數據庫中的集合
6.db.<collection>.insert(doc)? 插入文檔??
7.db.<collection>.find() 查看所有的文檔
8.db.<collection>.find({key:value}) 查看帶有指定key value文檔的集合
9.db.<collection>.findOne({key:value}).name 查看指定key value的第一個文檔
10.db.<collection>.find({key:value}).count() 查看數量
11.db.<collection>.find({key:value}).length() 查看數量
12.db.<collection>.update(doc1,doc2) 把查詢帶有doc1的屬性的文檔用doc2替代
13.?db.student.update({age:1000},{$set:{strenth:10}}) 如何設置屬性,沒有屬性可以增加屬性
14.?db.student.update({age:1000},{$unset:{strenth:10}}) 刪除strenth為key的條目
15.db.student.remove(doc,isSingle)?? 刪除一個或者多個
16.db.student.deleteOne(doc)? ? ?刪除一個
17.db.student.deleteMany(doc)? ? 刪除多個
18.remove(doc,true) 第二個參數傳入true,則只刪除一個
19.remove({}) 全部刪除?
20.db.mycol.find(?{?$or: [? {key1: value1}, {key2:value2}?]?}).pretty()? "AND"或"OR"條件循環查詢集合中的文檔
21.db.collectionName.find().pretty() 格式化輸出
MongoDB支持哪些數據類型
- String
- Integer
- Double
- Boolean
- Object
- Object ID
- Arrays
- Min/Max Keys
- Datetime
- Code
- Regular Expression等
為什么要在MongoDB中用"Code"數據類型
"Code"類型用于在文檔中存儲 JavaScript 代碼。
MongoDB 支持存儲過程嗎?如果支持的話,怎么用?
MongoDB 支持存儲過程,它是 javascript 寫的,保存在 db.system.js 表中。
MongoDB 與 RDBMS Where 語句比較
如果你熟悉常規的 SQL 數據,通過下表可以更好的理解 MongoDB 的條件語句查詢:
| 等于 | {<key>:<value>} | db.col.find({"by":"菜鳥教程"}).pretty() | where by = '菜鳥教程' |
| 小于 | {<key>:{$lt:<value>}} | db.col.find({"likes":{$lt:50}}).pretty() | where likes < 50 |
| 小于或等于 | {<key>:{$lte:<value>}} | db.col.find({"likes":{$lte:50}}).pretty() | where likes <= 50 |
| 大于 | {<key>:{$gt:<value>}} | db.col.find({"likes":{$gt:50}}).pretty() | where likes > 50 |
| 大于或等于 | {<key>:{$gte:<value>}} | db.col.find({"likes":{$gte:50}}).pretty() | where likes >= 50 |
| 不等于 | {<key>:{$ne:<value>}} | db.col.find({"likes":{$ne:50}}).pretty() | where likes != 50 |
32 位系統上有什么細微差別?
journaling 會激活額外的內存映射文件。這將進一步抑制 32 位版本上的數據庫大小。因此,現在journaling 在 32 位系統上默認是禁用的。
?journal 回放在條目(entry)不完整時(比如恰巧有一個中途故障了)會遇到問題嗎?
每個 journal (group)的寫操作都是一致的,除非它是完整的否則在恢復過程中它不會回放。
分析器在 MongoDB 中的作用是什么?
MongoDB 中包括了一個可以顯示數據庫中每個操作性能特點的數據庫分析器。通過這個分析器你可以找到比預期慢的查詢(或寫操作);利用這一信息,比如,可以確定是否需要添加索引。
名字空間(namespace)是什么?
MongoDB 存儲 BSON 對象在叢集(collection)中。數據庫名字和叢集名字以句點連結起來叫做名字空間(namespace)。
一個集合命名空間又有多個數據域(extent),集合命名空間里存儲著集合的元數據,比如集合名稱,集合的第一個數據域和最后一個數據域的位置等等。而一個數據域由若干條文檔(document)組成,每個數據域都有一個頭部,記錄著第一條文檔和最后一條文檔的為知,以及該數據域的一些元數據。extent之間,document之間通過雙向鏈表連接。
索引的存儲數據結構是B樹,索引命名空間存儲著對B樹的根節點的指針。
如果用戶移除對象的屬性,該屬性是否從存儲層中刪除?
是的,用戶移除屬性然后對象會重新保存(re-save())。
能否使用日志特征進行安全備份?
是的。
允許空值 null 嗎?
對于對象成員而言,是的。
用戶不能夠添加空值(null)到數據庫叢集(collection)因為空值不是對象。然而用戶能夠添加空對象{}。
更新操作立刻 fsync 到磁盤?
不會,磁盤寫操作默認是延遲執行的。寫操作可能在兩三秒(默認在 60 秒內)后到達磁盤。例如,如果一秒內數據庫收到一千個對一個對象遞增的操作,僅刷新磁盤一次。(注意,盡管 fsync 選項在命令行和經過 getLastError_old 是有效的)(譯者:也許是坑人的面試題??)。
如何執行事務/加鎖?
MongoDB 沒有使用傳統的鎖或者復雜的帶回滾的事務,因為它設計的宗旨是輕量,快速以及可預計的高性能??梢园阉惐瘸?MySQL MylSAM 的自動提交模式。通過精簡對事務的支持,性能得到了提升,特別是在一個可能會穿過多個服務器的系統里。
為什么數據文件如此龐大?
MongoDB 會積極的預分配預留空間來防止文件系統碎片。
啟用備份故障恢復需要多久?
從備份數據庫聲明主數據庫宕機到選出一個備份數據庫作為新的主數據庫將花費 10 到 30 秒時間。這期間在主數據庫上的操作將會失敗--包括寫入和強一致性讀取(strong consistent read)操作。然而,你還能在第二數據庫上執行最終一致性查詢(eventually consistent query)(在 slaveOk 模式下),即使在這段時間里。
什么是 master 或 primary?
它是當前備份集群(replica set)中負責處理所有寫入操作的主要節點/成員。在一個備份集群中,當失效備援(failover)事件發生時,一個另外的成員會變成 primary。
什么是 secondary 或 slave?
Seconday 從當前的 primary 上復制相應的操作。它是通過跟蹤復制 oplog(local.oplog.rs)做到的。
我必須調用 getLastError 來確保寫操作生效了么?
不用。不管你有沒有調用 getLastError(又叫"Safe Mode")服務器做的操作都一樣。調用 getLastError 只是為了確認寫操作成功提交了。當然,你經常想得到確認,但是寫操作的安全性和是否生效不是由這個決定的。
?MongoDB中的分片什么意思
分片是將數據水平切分到不同的物理節點。當應用數據越來越大的時候,數據量也會越來越大。當數據量增長時,單臺機器有可能無法存儲數據或可接受的讀取寫入吞吐量。利用分片技術可以添加更多的機器來應對數據量增加以及讀寫操作的要求。
我應該啟動一個集群分片(sharded)還是一個非集群分片的 MongoDB 環境?
為開發便捷起見,我們建議以非集群分片(unsharded)方式開始一個 MongoDB 環境,除非一臺服務器不足以存放你的初始數據集。從非集群分片升級到集群分片(sharding)是無縫的,所以在你的數據集還不是很大的時候沒必要考慮集群分片(sharding)。
分片(sharding)和復制(replication)是怎樣工作的?
每一個分片(shard)是一個分區數據的邏輯集合。分片可能由單一服務器或者集群組成,我們推薦為每一個分片(shard)使用集群。
ObjectID 有哪些部分組成
一共有四部分組成:時間戳、客戶端 ID、客戶進程 ID、三個字節的增量計數器。
數據在什么時候才會擴展到多個分片(shard)里?
MongoDB 分片是基于區域(range)的。所以一個集合(collection)中的所有的對象都被存放到一個塊(chunk)中。只有當存在多余一個塊的時候,才會有多個分片獲取數據的選項?,F在,每個默認塊的大小是 64Mb,所以你需要至少 64 Mb 空間才可以實施一個遷移。
當我試圖更新一個正在被遷移的塊(chunk)上的文檔時會發生什么?
更新操作會立即發生在舊的分片(shard)上,然后更改才會在所有權轉移(ownership transfers)前復制到新的分片上。
如果在一個分片(shard)停止或者很慢的時候,我發起一個查詢會怎樣?
如果一個分片(shard)停止了,除非查詢設置了“Partial”選項,否則查詢會返回一個錯誤。如果一個分片(shard)響應很慢,MongoDB 則會等待它的響應。
我可以把 moveChunk 目錄里的舊文件刪除嗎?
沒問題,這些文件是在分片(shard)進行均衡操作(balancing)的時候產生的臨時文件。一旦這些操作已經完成,相關的臨時文件也應該被刪除掉。但目前清理工作是需要手動的,所以請小心地考慮再釋放這些文件的空間。
我怎么查看 Mongo 正在使用的鏈接?
db._adminCommand("connPoolStats");
如果塊移動操作(moveChunk)失敗了,我需要手動清除部分轉移的文檔嗎?
不需要,移動操作是一致(consistent)并且是確定性的(deterministic);一次失敗后,移動操作會不斷重試;當完成后,數據只會出現在新的分片里(shard)。
如果我在使用復制技術(replication),可以一部分使用日志(journaling)而其他部分則不使用嗎?
可以。
當更新一個正在被遷移的塊(Chunk)上的文檔時會發生什么?
更新操作會立即發生在舊的塊(Chunk)上,然后更改才會在所有權轉移前復制到新的分片上。
解釋一下 MongoDB 中的索引是什么?
索引是 MongoDB 中的特殊結構,它以易于遍歷的形式存儲一小部分數據集。
索引按索引中指定的字段的值排序,存儲特定字段或一組字段的值。
如何添加索引
使用db.collection.createIndex()在集合中創建一個索引
什么是集合(表)
集合就是一組 MongoDB 文檔。它相當于關系型數據庫(RDBMS)中的表這種概念。集合位于單獨的一個數據庫中。一個集合內的多個文檔可以有多個不同的字段。一般來說,集合中的文檔都有著相同或相關的目的。
提到如何檢查函數的源代碼?
要檢查沒有任何括號的函數源代碼,必須調用該函數。
MongoDB 在 A:{B,C}上建立索引,查詢 A:{B,C}和 A:{C,B}都會使用索引嗎?
不會,只會在 A:{B,C}上使用索引。
如果一個分片(Shard)停止或很慢的時候,發起一個查詢會怎樣?
如果一個分片停止了,除非查詢設置了“Partial”選項,否則查詢會返回一個錯誤。如果一個分片響應很慢,MongoDB 會等待它的響應。
如何理解 MongoDB 中的 GridFS 機制,MongoDB 為何使用 GridFS 來存儲文件?
GridFS 是一種將大型文件存儲在 MongoDB 中的文件規范。使用 GridFS 可以將大文件分隔成多個小文檔存放,這樣我們能夠有效的保存大文檔,而且解決了 BSON 對象有限制的問題。
總結
以上是生活随笔為你收集整理的手撸架构,MongDB 面试50问的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【连载】从单片机到操作系统⑥——Free
- 下一篇: poj 2955 区间dp