MongoDB常見面試題總結(上)

MongoDB 基礎

MongoDB 是什么?

MongoDB 是一個基于 分布式文件存儲 的開源 NoSQL 數據庫系統,由 C++ 編寫的。MongoDB 提供了 面向文檔 的存儲方式,操作起來比較簡單和容易,支持“無模式”的數據建模,可以存儲比較復雜的數據類型,是一款非常流行的 文檔類型數據庫

在高負載的情況下,MongoDB 天然支持水平擴展和高可用,可以很方便地添加更多的節點/實例,以保證服務性能和可用性。在許多場景下,MongoDB 可以用于代替傳統的關系型數據庫或鍵/值存儲方式,皆在為 Web 應用提供可擴展的高可用高性能數據存儲解決方案。

MongoDB 的存儲結構是什么?

MongoDB 的存儲結構區別于傳統的關系型數據庫,主要由如下三個單元組成:

  • 文檔(Document):MongoDB 中最基本的單元,由 BSON 鍵值對(key-value)組成,類似于關系型數據庫中的行(Row)。
  • 集合(Collection):一個集合可以包含多個文檔,類似于關系型數據庫中的表(Table)。
  • 數據庫(Database):一個數據庫中可以包含多個集合,可以在 MongoDB 中創建多個數據庫,類似于關系型數據庫中的數據庫(Database)。

也就是說,MongoDB 將數據記錄存儲為文檔 (更具體來說是BSON 文檔),這些文檔在集合中聚集在一起,數據庫中存儲一個或多個文檔集合。

SQL 與 MongoDB 常見術語對比

SQLMongoDB
表(Table)集合(Collection)
行(Row)文檔(Document)
列(Col)字段(Field)
主鍵(Primary Key)對象 ID(Objectid)
索引(Index)索引(Index)
嵌套表(Embedded Table)嵌入式文檔(Embedded Document)
數組(Array)數組(Array)
文檔

MongoDB 中的記錄就是一個 BSON 文檔,它是由鍵值對組成的數據結構,類似于 JSON 對象,是 MongoDB 中的基本數據單元。字段的值可能包括其他文檔、數組和文檔數組。

文檔的鍵是字符串。除了少數例外情況,鍵可以使用任意 UTF-8 字符。

  • 鍵不能含有 \0(空字符)。這個字符用來表示鍵的結尾。
  • .$ 有特別的意義,只有在特定環境下才能使用。
  • 以下劃線_開頭的鍵是保留的(不是嚴格要求的)。

BSON [bee·sahn] 是 Binary JSON的簡稱,是 JSON 文檔的二進制表示,支持將文檔和數組嵌入到其他文檔和數組中,還包含允許表示不屬于 JSON 規范的數據類型的擴展。有關 BSON 規范的內容,可以參考 bsonspec.org,另見BSON 類型。

根據維基百科對 BJSON 的介紹,BJSON 的遍歷速度優于 JSON,這也是 MongoDB 選擇 BSON 的主要原因,但 BJSON 需要更多的存儲空間。

與 JSON 相比,BSON 著眼于提高存儲和掃描效率。BSON 文檔中的大型元素以長度字段為前綴以便于掃描。在某些情況下,由于長度前綴和顯式數組索引的存在,BSON 使用的空間會多于 JSON。

集合

MongoDB 集合存在于數據庫中,沒有固定的結構,也就是?無模式?的,這意味著可以往集合插入不同格式和類型的數據。不過,通常情況下,插入集合中的數據都會有一定的關聯性。

MongoDB 集合

集合

MongoDB 集合存在于數據庫中,沒有固定的結構,也就是?無模式?的,這意味著可以往集合插入不同格式和類型的數據。不過,通常情況下,插入集合中的數據都會有一定的關聯性。

MongoDB 集合

?

集合不需要事先創建,當第一個文檔插入或者第一個索引創建時,如果該集合不存在,則會創建一個新的集合。

集合名可以是滿足下列條件的任意 UTF-8 字符串:

  • 集合名不能是空字符串""
  • 集合名不能含有 \0 (空字符),這個字符表示集合名的結尾。
  • 集合名不能以"system."開頭,這是為系統集合保留的前綴。例如 system.users 這個集合保存著數據庫的用戶信息,system.namespaces 集合保存著所有數據庫集合的信息。
  • 集合名必須以下劃線或者字母符號開始,并且不能包含 $
數據庫

數據庫用于存儲所有集合,而集合又用于存儲所有文檔。一個 MongoDB 中可以創建多個數據庫,每一個數據庫都有自己的集合和權限。

MongoDB 預留了幾個特殊的數據庫。

  • admin : admin 數據庫主要是保存 root 用戶和角色。例如,system.users 表存儲用戶,system.roles 表存儲角色。一般不建議用戶直接操作這個數據庫。將一個用戶添加到這個數據庫,且使它擁有 admin 庫上的名為 dbAdminAnyDatabase 的角色權限,這個用戶自動繼承所有數據庫的權限。一些特定的服務器端命令也只能從這個數據庫運行,比如關閉服務器。
  • local : local 數據庫是不會被復制到其他分片的,因此可以用來存儲本地單臺服務器的任意 collection。一般不建議用戶直接使用 local 庫存儲任何數據,也不建議進行 CRUD 操作,因為數據無法被正常備份與恢復。
  • config : 當 MongoDB 使用分片設置時,config 數據庫可用來保存分片的相關信息。
  • test : 默認創建的測試庫,連接 mongod 服務時,如果不指定連接的具體數據庫,默認就會連接到 test 數據庫。

數據庫名可以是滿足以下條件的任意 UTF-8 字符串:

  • 不能是空字符串""
  • 不得含有' '(空格)、.$/\\0 (空字符)。
  • 應全部小寫。
  • 最多 64 字節。

數據庫名最終會變成文件系統里的文件,這也就是有如此多限制的原因。

MongoDB 有什么特點?

  • admin : admin 數據庫主要是保存 root 用戶和角色。例如,system.users 表存儲用戶,system.roles 表存儲角色。一般不建議用戶直接操作這個數據庫。將一個用戶添加到這個數據庫,且使它擁有 admin 庫上的名為 dbAdminAnyDatabase 的角色權限,這個用戶自動繼承所有數據庫的權限。一些特定的服務器端命令也只能從這個數據庫運行,比如關閉服務器。
  • local : local 數據庫是不會被復制到其他分片的,因此可以用來存儲本地單臺服務器的任意 collection。一般不建議用戶直接使用 local 庫存儲任何數據,也不建議進行 CRUD 操作,因為數據無法被正常備份與恢復。
  • config : 當 MongoDB 使用分片設置時,config 數據庫可用來保存分片的相關信息。
  • test : 默認創建的測試庫,連接 mongod 服務時,如果不指定連接的具體數據庫,默認就會連接到 test 數據庫。

數據庫名可以是滿足以下條件的任意 UTF-8 字符串:

  • 不能是空字符串""
  • 不得含有' '(空格)、.$/\\0 (空字符)。
  • 應全部小寫。
  • 最多 64 字節。

數據庫名最終會變成文件系統里的文件,這也就是有如此多限制的原因。

MongoDB 適合什么應用場景?

MongoDB 的優勢在于其數據模型和存儲引擎的靈活性、架構的可擴展性以及對強大的索引支持。

選用 MongoDB 應該充分考慮 MongoDB 的優勢,結合實際項目的需求來決定:

  • 隨著項目的發展,使用類 JSON 格式(BSON)保存數據是否滿足項目需求?MongoDB 中的記錄就是一個 BSON 文檔,它是由鍵值對組成的數據結構,類似于 JSON 對象,是 MongoDB 中的基本數據單元。
  • 是否需要大數據量的存儲?是否需要快速水平擴展?MongoDB 支持分片集群,可以很方便地添加更多的節點(實例),讓集群存儲更多的數據,具備更強的性能。
  • 是否需要更多類型索引來滿足更多應用場景?MongoDB 支持多種類型的索引,包括單字段索引、復合索引、多鍵索引、哈希索引、文本索引、 地理位置索引等,每種類型的索引有不同的使用場合。
  • ……

MongoDB 存儲引擎

MongoDB 支持哪些存儲引擎?

存儲引擎(Storage Engine)是數據庫的核心組件,負責管理數據在內存和磁盤中的存儲方式。

與 MySQL 一樣,MongoDB 采用的也是 插件式的存儲引擎架構 ,支持不同類型的存儲引擎,不同的存儲引擎解決不同場景的問題。在創建數據庫或集合時,可以指定存儲引擎。

插件式的存儲引擎架構可以實現 Server 層和存儲引擎層的解耦,可以支持多種存儲引擎,如 MySQL 既可以支持 B-Tree 結構的 InnoDB 存儲引擎,還可以支持 LSM 結構的 RocksDB 存儲引擎。

在存儲引擎剛出來的時候,默認是使用 MMAPV1 存儲引擎,MongoDB4.x 版本不再支持 MMAPv1 存儲引擎。

現在主要有下面這兩種存儲引擎:

  • WiredTiger 存儲引擎:自 MongoDB 3.2 以后,默認的存儲引擎為 WiredTiger 存儲引擎 。非常適合大多數工作負載,建議用于新部署。WiredTiger 提供文檔級并發模型、檢查點和數據壓縮(后文會介紹到)等功能。
  • In-Memory 存儲引擎:In-Memory 存儲引擎在 MongoDB Enterprise 中可用。它不是將文檔存儲在磁盤上,而是將它們保留在內存中以獲得更可預測的數據延遲。

此外,MongoDB 3.0 提供了 可插拔的存儲引擎 API ,允許第三方為 MongoDB 開發存儲引擎,這點和 MySQL 也比較類似。

WiredTiger 基于 LSM Tree 還是 B+ Tree?

目前絕大部分流行的數據庫存儲引擎都是基于 B/B+ Tree 或者 LSM(Log Structured Merge) Tree 來實現的。對于 NoSQL 數據庫來說,絕大部分(比如 HBase、Cassandra、RocksDB)都是基于 LSM 樹,MongoDB 不太一樣。

上面也說了,自 MongoDB 3.2 以后,默認的存儲引擎為 WiredTiger 存儲引擎。在 WiredTiger 引擎官網上,我們發現 WiredTiger 使用的是 B+ 樹作為其存儲結構:

WiredTiger maintains a table's data in memory using a data structure called a B-Tree ( B+ Tree to be specific), referring to the nodes of a B-Tree as pages. Internal pages carry only keys. The leaf pages store both keys and values.

此外,WiredTiger 還支持 LSM(Log Structured Merge) 樹作為存儲結構,MongoDB 在使用 WiredTiger 作為存儲引擎時,默認使用的是 B+ 樹。

如果想要了解 MongoDB 使用 B+ 樹的原因,可以看看這篇文章:【駁斥八股文系列】別瞎分析了,MongoDB 使用的是 B+ 樹,不是你們以為的 B 樹。

使用 B+ 樹時,WiredTiger 以 page 為基本單位往磁盤讀寫數據。B+ 樹的每個節點為一個 page,共有三種類型的 page:

  • root page(根節點):B+ 樹的根節點。
  • internal page(內部節點):不實際存儲數據的中間索引節點。
  • leaf page(葉子節點):真正存儲數據的葉子節點,包含一個頁頭(page header)、塊頭(block header)和真正的數據(key/value),其中頁頭定義了頁的類型、頁中實際載荷數據的大小、頁中記錄條數等信息;塊頭定義了此頁的 checksum、塊在磁盤上的尋址位置等信息。

其整體結構如下圖所示:

如果想要深入研究學習 WiredTiger 存儲引擎,推薦閱讀 MongoDB 中文社區的?WiredTiger 存儲引擎系列

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/76040.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/76040.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/76040.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Java設計模式】第2章 UML急速入門

2-1 本章導航 UML類圖與時序圖入門 UML定義 統一建模語言(Unified Modeling Language):第三代非專利建模語言。特點:開放方法,支持可視化構建面向對象系統,涵蓋模型、流程、代碼等。UML分類(2.2版本) 結構式圖形:系統靜態建模(類圖、對象圖、包圖)。行為式圖形:事…

【4】搭建k8s集群系列(二進制部署)之安裝master節點組件(kube-apiserver)

一、下載k8s二進制文件 下載地址: https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG -1.20.md 注:打開鏈接你會發現里面有很多包,下載一個 server 包就夠了,包含了 Master 和 Worker Node 二進制文件。…

電子電氣架構 --- AUTOSAR 的信息安全架構

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 周末洗了一個澡,換了一身衣服,出了門卻不知道去哪兒,不知道去找誰,漫無目的走著,大概這就是成年人最深的孤獨吧! 舊人不知我近況,新人不知我過…

ROS2與OpenAI Gym集成指南:從安裝到自定義環境與強化學習訓練

1.理解 ROS2 和 OpenAI Gym 的基本概念 ROS2(Robot Operating System 2):是一個用于機器人軟件開發的框架。它提供了一系列的工具、庫和通信機制,方便開發者構建復雜的機器人應用程序。例如,ROS2 可以處理機器人不同組…

【設計模式】創建型 -- 單例模式 (c++實現)

文章目錄 單例模式使用場景c實現靜態局部變量餓漢式(線程安全)懶漢式(線程安全)懶漢式(線程安全) 智能指針懶漢式(線程安全)智能指針call_once懶漢式(線程安全)智能指針call_onceCRTP 單例模式 單例模式是…

C語言之九九乘法表

一、代碼展示 二、運行結果 三、代碼分析 首先->是外層循環是小于等于9的 然后->是內層循環是小于等于外層循環的 最后->就是\n讓九九乘法表的格式更加美觀(當然 電腦不同 有可能%2d 也有可能%3d) 四、與以下素數題目邏輯相似 五、運行結果

自動化備份全網服務器數據平臺

自動化備份全網服務器數據平臺 項目背景知識 總體需求 某企業里有一臺Web服務器,里面的數據很重要,但是如果硬盤壞了數據就會丟失,現在領導要求把數據做備份,這樣Web服務器數據丟失在可以進行恢復。要求如下:1.每天0…

stm32+esp8266+機智云手機app

現在很多大學嵌入式畢設都要求云端控制,本文章就教一下大家如何使用esp8266去連接機智云的app去進行顯示stm32的外設傳感器數據啊,控制一些外設啊等。 因為本文章主要教大家如何移植機智云的代碼到自己的工程,所以前面的一些準備工作&#x…

時序數據庫 TDengine Cloud 私有連接實戰指南:4步實現數據安全傳輸與成本優化

小T導讀:在物聯網和工業互聯網場景下,企業對高并發、低延遲的數據處理需求愈發迫切。本文將帶你深入了解 TDengineCloud 如何通過全托管服務與私有連接,幫助企業實現更安全、更高效、更低成本的數據采集與傳輸,從架構解析到實際配…

【Java面試系列】Spring Boot中自動配置原理與自定義Starter開發實踐詳解 - 3-5年Java開發必備知識

【Java面試系列】Spring Boot中自動配置原理與自定義Starter開發實踐詳解 - 3-5年Java開發必備知識 引言 Spring Boot作為Java生態中最流行的框架之一,其自動配置機制和Starter開發是面試中的高頻考點。對于3-5年經驗的Java開發者來說,深入理解這些原理…

解決Spring Boot Test中的ByteBuddy類缺失問題

目錄 解決Spring Boot Test中的ByteBuddy類缺失問題前奏問題描述問題解決第一步:移除ByteBuddy的特定版本號第二步:更新maven-surefire-plugin配置第三步:清理并重新構建項目 結語 解決Spring Boot Test中的ByteBuddy類缺失問題 前奏 今天&…

IntelliJ IDEA使用技巧(json字符串格式化)

文章目錄 一、IDEA自動格式化json字符串二、配置/查找格式化快捷鍵 本文主要講述idea中怎么將json字符串轉換為JSON格式的內容并且有層級結構。 效果: 轉換前: 轉換后: 一、IDEA自動格式化json字符串 步驟一:首先創建一個臨…

眨眼睛查看密碼工具類

“眨眼睛查看密碼”工具類實現思路: 一、核心功能 實現點擊眼睛圖標切換密碼明文/星號顯示,提升表單輸入體驗。包含以下關鍵功能: ? 初始狀態:密碼框顯示為星號,閉眼圖標可見。 ? 點擊閉眼圖標:切換為明…

【GPT入門】第33課 從應用場景出發,區分 TavilyAnswer 和 TavilySearchResults,代碼實戰

【GPT入門】第33課 從應用場景出發,區分 TavilyAnswer 和 TavilySearchResults,代碼實戰 1. 區別應用場景 2. 代碼使用3.代碼執行效果 在langchain_community.tools.tavily_search中,TavilyAnswer和TavilySearchResults有以下區別和應用場景&…

【Java設計模式】第10章 外觀模式講解

10. 外觀模式 10.1 外觀模式講解 定義:為子系統提供統一接口,簡化調用。類型:結構型模式適用場景: 子系統復雜需簡化調用分層系統需統一入口優點: 降低耦合符合迪米特法則(最少知道原則)缺點: 擴展子系統需修改外觀類,違反開閉原則10.2 外觀模式 Coding // 子系統:…

Dubbo的簡單介紹

Dubbo的簡單介紹 Dubbo 是一個高性能的 Java RPC 框架,最初由阿里巴巴開發,用于構建分布式服務。它主要用于提供服務間的通信,支持高效的遠程調用和服務治理,常用于大規模分布式系統中。Dubbo 提供了以下幾個核心功能&#xff1a…

每日一題(小白)數組娛樂篇17

對一個數組進行接收進行操作后輸出。輸入三個操作數abc,將數組下標a到b的數字加上c;輸入四個操作數abcd,將下標c到d的數字復制到a到b,可以借用一個中間量數組實現;兩個操作數ab,將數組下標a到b的數字加和輸…

總結一下常見的EasyExcel面試題

說一下你了解的POI和EasyExcel POI(Poor Obfuscation Implementation):它是 Apache 軟件基金會的一個開源項目,為 Java 程序提供了讀寫 Microsoft Office 格式文件的功能,支持如 Excel、Word、PowerPoint 等多種文件格…

01-Redis-基礎

1 redis誕生歷程 redis的作者筆名叫做antirez,2008年的時候他做了一個記錄網站訪問情況的系統,比如每天有多少個用戶,多少個頁面被瀏覽,訪客的IP、操作系統、瀏覽器、使用的搜索關鍵詞等等(跟百度統計、CNZZ功能一樣)。最開始存儲…

在 Ubuntu 上離線安裝 Prometheus 和 Grafana

在 Ubuntu 上離線安裝 Prometheus 和 Grafana 的步驟如下: 一.安裝驗證 二.安裝步驟 1.準備離線安裝包 在一臺可以訪問互聯網的機器上下載 Prometheus 和 Grafana 的二進制文件。 Prometheus 下載地址:Prometheus 官方下載頁面Grafana 下載地址:Grafana 官方下載頁面下載所…