MongoDB面試題


1.什么是MongoDB

MongoDB是一個文檔數據庫,提供好的性能,領先的非關系型數據庫。采用BSON存儲文檔數據。
BSON()是一種類json的一種二進制形式的存儲格式,簡稱Binary JSON.
相對於json多了date類型和二進制數組。

 

2.MongoDB的優勢有哪些

  • 面向文檔的存儲:以 JSON 格式的文檔保存數據。
  • 任何屬性都可以建立索引。
  • 復制以及高可擴展性。
  • 自動分片。
  • 豐富的查詢功能。
  • 快速的即時更新。

 

3 什么是數據庫

  數據庫可以看成是一個電子化的文件櫃,用戶可以對文件中的數據運行新增、檢索、更新、刪除等操作。數據庫是一個
所有集合的容器,在文件系統中每一個數據庫都有一個相關的物理文件。

 

4.什么是集合(表)

    集合就是一組 MongoDB 文檔。它相當於關系型數據庫(RDBMS)中的表這種概念。集合位於單獨的一個數據庫中。
一個集合內的多個文檔可以有多個不同的字段。一般來說,集合中的文檔都有着相同或相關的目的。

 

5 什么是文檔(記錄)

  文檔由一組key value組成。文檔是動態模式,這意味着同一集合里的文檔不需要有相同的字段和結構。在關系型
數據庫中table中的每一條記錄相當於MongoDB中的一個文

 

6 MongoDB和關系型數據庫術語對比圖

 

7.什么是非關系型數據庫

  非關系型數據庫的顯著特點是不使用SQL作為查詢語言,數據存儲不需要特定的表格模式。

 

8 為什么用MOngoDB?

  • 架構簡單
  • 沒有復雜的連接
  • 深度查詢能力,MongoDB支持動態查詢。
  • 容易調試
  • 容易擴展
  • 不需要轉化/映射應用對象到數據庫對象
  • 使用內部內存作為存儲工作區,以便更快的存取數據。

 

9 在哪些場景使用MongoDB

  • 大數據
  • 內容管理系統
  • 移動端Apps
  • 數據管理

 10 MongoDB中的命名空間是什么意思?

mongodb存儲bson對象在叢集(collection)中.數據庫名字和叢集名字以句點連結起來叫做名字空間(namespace).

  一個集合命名空間又有多個數據域(extent),集合命名空間里存儲着集合的元數據,比如集合名稱,集合的
第一個數據域和最后一個數據域的位置等等。而一個數據域由若干條文檔(document)組成,每個數據域都有一個
頭部,記錄着第一條文檔和最后一條文檔的為知,以及該數據域的一些元數據。extent之間,document之間通過
雙向鏈表連接。 索引的存儲數據結構是B樹,索引命名空間存儲着對B樹的根節點的指針。

 

11 monogodb 中的分片什么意思

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

 

12 為什么要在MongoDB中使用分析器

  mongodb中包括了一個可以顯示數據庫中每個操作性能特點的數據庫分析器.通過這個分析器你可以找到比預期慢
的查詢(或寫操作);利用這一信息,比如,可以確定是否需要添加索引.

 

13 .MongoDB支持主鍵外鍵關系嗎

  默認MongoDB不支持主鍵和外鍵關系。 用Mongodb本身的API需要硬編碼才能實現外鍵關聯,不夠直觀且難度
較大

 

 14 MongoDB支持哪些數據類型

    • String
    • Integer
    • Double
    • Boolean
    • Object
    • Object ID
    • Arrays
    • Min/Max Keys
    • Datetime
    • Code
    • Regular Expression等

 

15 為什么要在MongoDB中用"Code"數據類型

"Code"類型用於在文檔中存儲 JavaScript 代碼。

 

16 為什么要在MongoDB中用"Regular Expression"數據類型

"Regular Expression"類型用於在文檔中存儲正則表達式

 

17 為什么在MongoDB中使用"Object ID"數據類型

"ObjectID"數據類型用於存儲文檔id

 

18"ObjectID"有哪些部分組成

一共有四部分組成:時間戳、客戶端ID、客戶進程ID、三個字節的增量計數器

 

19 在MongoDb中什么是索引

    索引用於高效的執行查詢,沒有索引的MongoDB將掃描整個集合中的所有文檔,這種掃描效率很低,需要處理大量
的數據. 索引是一種特殊的數據結構,將一小塊數據集合保存為容易遍歷的形式.索引能夠存儲某種特殊字段或字段集的
值,並按照索引指定的方式將字段值進行排序.

 

20 如何添加索引

使用db.collection.createIndex()在集合中創建一個索引

 

21.如何查詢集合中的文檔

db.collectionName.find({key:value})

 

22用什么方法可以格式化輸出結果

db.collectionName.find().pretty()

 

23 如何使用"AND"或"OR"條件循環查詢集合中的文檔

db.mycol.find(
   {
      $or: [
         {key1: value1}, {key2:value2}
      ]
   }
).pretty()

 

24 更新數據

db.collectionName.update({key:value},{$set:{newkey:newValue}})

 

25 如何刪除文檔

db.collectionName.remove({key:value})

 

26 在MongoDB中如何排序

並使用 1 和 -1 來指定排序方式,其中 1 表示升序,而 -1 表示降序。

db.connectionName.find({key:value}).sort({columnName:1})

 

27 什么是聚合

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

db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)

 

28 在MongoDB中什么是副本集(避免單點故障)

    在MongoDB中副本集由一組MongoDB實例組成,包括一個主節點多個次節點,MongoDB客戶端的所有數據都
寫入主節點(Primary),副節點從主節點同步寫入數據,以保持所有復制集內存儲相同的數據,提高數據可用性。

 

29 什么是NoSQL數據庫?NoSQL和RDBMS有什么區別?在哪些情況下使用和不使用NoSQL數據庫?

 NoSQL是非關系型數據庫,NoSQL = Not Only SQL。
關系型數據庫采用的結構化的數據,NoSQL采用的是鍵值對的方式存儲數據。 在處理非結構化/半結構化的大數據時;在水平方向上進行擴展時;隨時應對動態增加的數據項時可以優先考慮
使用NoSQL數據庫。 在考慮數據庫的成熟度;支持;分析和商業智能;管理及專業性等問題時,應優先考慮關系型數據庫。

 

30 MongoDB支持存儲過程嗎?如果支持的話,怎么用?

MongoDB支持存儲過程,它是javascript寫的,保存在db.system.js表中。

 

31如何理解MongoDB中的GridFS機制,MongoDB為何使用GridFS來存儲文件?

  GridFS是一種將大型文件存儲在MongoDB中的文件規范。使用GridFS可以將大文件分隔成多個小文檔存放,這樣我們能夠有效的保存大文檔,而且解決了BSON對象有限制的問題。

 

32 為什么MongoDB的數據文件很大?

  MongoDB采用的預分配空間的方式來防止文件碎片。

 

33 當更新一個正在被遷移的塊(Chunk)上的文檔時會發生什么?

  更新操作會立即發生在舊的塊(Chunk)上,然后更改才會在所有權轉移前復制到新的分片上。

 

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

  不會,只會在A:{B,C}上使用索引。

 

35 mongodb成為最好nosql數據庫的原因是什么?

  面向文件的 高性能 高可用性 易擴展性 豐富的查詢語言

 

36 如果用戶移除對象的屬性,該屬性是否從存儲層中刪除?

  是的,用戶移除屬性然后對象會重新保存(re-save()).

 

37 允許空值null嗎?

  對於對象成員而言,是的.然而用戶不能夠添加空值(null)到數據庫叢集(collection)因為空值不是對象.然而用戶能夠添加空對象{}.

 

38 更新操作立刻fsync到磁盤?

  不會,磁盤寫操作默認是延遲執行的.寫操作可能在兩三秒(默認在60秒內)后到達磁盤.例如,如果一秒內數據庫收到一千個對一個對象遞增的操作,僅刷新磁盤一次.

 

39 如何執行事務/加鎖?

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

 

40  啟用備份故障恢復需要多久?

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

 

41  什么是master或primary?

  它是當前備份集群(replica set)中負責處理所有寫入操作的主要節點/成員.在一個備份集群中,當失效備援(failover)事件發生時,一個另外的成員會變成primary.

 

42  我應該啟動一個集群分片(sharded)還是一個非集群分片的 mongodb 環境?

  (數據量大用集群分片,數據量小用非集群)

  為開發便捷起見,我們建議以非集群分片(unsharded)方式開始一個 mongodb 環境,除非一台服務器不足以存放你的初始數據集.從非集群分片升級到集群分片(sharding)是無縫的,所以在你的數據集還不是很大的時候沒必要考慮集群分片(sharding).

 

43 分片(sharding)和復制(replication)是怎樣工作的?

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

 

44數據在什么時候才會擴展到多個分片(shard)里?

  mongodb 分片是基於區域(range)的.所以一個集合(collection)中的所有的對象都被存放到一個塊(chunk)中.只有當存在多余一個塊的時候,才會有多個分片獲取數據的選項.現在,每個默認塊的大小是 64mb,所以你需要至少 64 mb 空間才可以實施一個遷移.

 

45 當我試圖更新一個正在被遷移的塊(chunk)上的文檔時會發生什么?

  更新操作會立即發生在舊的分片(shard)上,然后更改才會在所有權轉移(ownership transfers)前復制到新的分片上.

 

46 如果在一個分片(shard)停止或者很慢的時候,我發起一個查詢會怎樣?

  如果一個分片(shard)停止了,除非查詢設置了“partial”選項,否則查詢會返回一個錯誤.如果一個分片(shard)響應很慢,mongodb則會等待它的響應.

 

47 可以把movechunk目錄里的舊文件刪除嗎?

  沒問題,這些文件是在分片(shard)進行均衡操作(balancing)的時候產生的臨時文件.一旦這些操作已經完成,相關的臨時文件也應該被刪除掉.但目前清理工作是需要手動的,所以請小心地考慮再釋放這些文件的空間.

 

48 如果塊移動操作(movechunk)失敗了,我需要手動清除部分轉移的文檔嗎?

   不需要,移動操作是一致(consistent)並且是確定性的(deterministic);一次失敗后,移動操作會不斷重試;當完成后,數據只會出現在新的分片里(shard).

 

49 mongodb是否支持事務

  MongoDB 4.0的新特性——事務(Transactions):MongoDB 是不支持事務的,因此開發者在需要用到事務的時候,不得不借用其他工具,在業務代碼層面去彌補數據庫的不足。

  事務和會話(Sessions)關聯,一個會話同一時刻只能開啟一個事務操作,當一個會話斷開,這個會話中的事務也會結束。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM