在開始使用 MongoDB 之前我希望知道的 14 件事

文章的翻譯是在課程開始前夕準備的 “非關係型資料庫”.

在開始使用 MongoDB 之前我希望知道的 14 件事

亮點:

  • 開發模式極為重要,儘管它在 MongoDB 中是可選的。
  • 同樣,索引必須與您的架構和存取模式相符。
  • 避免使用大物件和大數組。
  • 請小心 MongoDB 設置,尤其是在安全性和可靠性方面。
  • MongoDB沒有查詢最佳化器,因此在執行查詢操作時必須小心。

我已經使用資料庫很長時間了,但直到最近才發現 MongoDB。 在我開始使用它之前,我希望我知道一些事情。 當一個人已經在某個領域有了經驗時,他們就會對資料庫是什麼以及資料庫做什麼有先入為主的觀念。 為了讓其他人更容易理解,我列出了常見錯誤的清單。

建立無需身份驗證的 MongoDB 伺服器

不幸的是,MongoDB 預設安裝時沒有進行身份驗證。 對於本地存取的工作站來說,這種做法很正常。 但由於 MongoDB 是一個多用戶系統,喜歡使用大量內存,因此最好將其放在具有盡可能多 RAM 的伺服器上,即使您只是將其用於開發。 透過預設連接埠在伺服器上安裝可能會出現問題,特別是如果可以在請求中執行任何 javascript 程式碼(例如, $where 作為一個想法 注射).

有多種身份驗證方法,但最簡單的方法是設定使用者 ID/密碼。 當您考慮基於以下內容的花哨身份驗證時,請使用這個想法 LDAP。 在安全性方面,MongoDB 應不斷更新,並且應始終檢查日誌是否存在未經授權的存取。 例如,我喜歡選擇不同的連接埠作為預設連接埠。

不要忘記將攻擊面綁定到 MongoDB

MongoDB 安全檢查表 包含降低網路入侵和資料外洩風險的好技巧。 人們很容易忽略這一點並說開發伺服器不需要高水準的安全性。 然而,事情並沒有那麼簡單,這適用於所有 MongoDB 伺服器。 特別是,如果沒有令人信服的理由使用 mapReduce, group$哪裡,您需要透過在設定檔中寫入來停用JavaScript中任意程式碼的使用 javascriptEnabled:false。 由於標準 MongoDB 中的資料檔案未加密,因此使用以下命令執行 MongoDB 是有意義的 專用用戶,它具有對檔案的完全存取權限,僅對檔案具有有限存取權限,並且能夠使用作業系統自己的檔案存取控制。

開發電路時出錯

MongoDB 不使用模式。 但這並不意味著不需要該方案。 如果您只想儲存沒有任何一致模式的文檔,那麼保存它們可以快速且輕鬆,但以後檢索它們可能會很困難。 該死的很難.

經典文章》MongoDB 架構設計的 6 個經驗法則” 值得一讀,其功能如下 模式瀏覽器 在第三方工具Studio 3T中,值得使用它來定期檢查電路。

不要忘記排序順序

與任何其他不正確的配置相比,忘記排序順序可能會導致更多的挫折感並浪費更多的時間。 預設情況下 MongoBD 使用 二進位排序。 但它不太可能對任何人都有用。 早在上世紀 80 年代,區分大小寫、區分重音、二元排序與珠子、長袍和捲曲小鬍子一樣,都被認為是奇怪的不合時宜的東西。 現在它們的使用是不可原諒的。 在現實生活中,「摩托車」與「摩托車」是一樣的。 「英國」和「不列顛」是同一個地方。 小寫字母只是大寫字母的等效形式。 別讓我開始對變音符號進行排序。 在 MongoDB 中建立資料庫時,使用不區分重音的排序規則 登記,對應語言和 系統使用者文化。 這將使搜尋字串資料變得更加容易。

建立包含大型文件的集合

MongoDB 很樂意在集合中託管高達 16MB 的大型文檔,並且 網格檔案系統 專為大於 16 MB 的大型文件而設計。 但僅僅因為可以放置大型文檔,就將它們儲存在那裡並不是一個好主意。 如果您儲存大小為數千位元組的單一文檔,並將它們更像是寬 SQL 表中的行,那麼 MongoDB 將發揮最佳作用。 大型文件將成為問題的根源 生產力.

使用大型數組建立文檔

文件可以包含數組。 數組中元素的數量最好遠離四位數。 如果頻繁地將元素添加到數組中,它將超出包含它的文檔,並且需要 移動,這意味著有必要 也更新索引。 當使用大數組重新索引文件時,索引通常會被覆蓋,因為存在 記錄,它存儲其索引。 當插入或刪除文件時也會發生這種重新索引。

MongoDB 有一個叫做 “填充因子”,這為文件成長提供了空間,以最大限度地減少此問題。
您可能認為無需數組索引即可完成。 不幸的是,缺少索引可能會導致您遇到其他問題。 由於文件是從頭到尾掃描的,因此搜尋數組末尾的元素將花費更長的時間,並且與此類文件相關的大多數操作將是 慢的.

不要忘記聚合中階段的順序很重要

在具有查詢最佳化器的資料庫系統中,您編寫的查詢是您想要取得什麼的解釋,而不是如何取得它。 這種機制類似於在餐廳點餐:通常你只是簡單點菜,而不給廚師詳細的指示。

在 MongoDB 中,您指導廚師。 例如,您需要確保資料通過 reduce 儘早在管道中使用 $match и $project,且排序僅發生在 reduce,並且搜尋完全按照您想要的順序進行。 擁有一個可以消除不必要的工作、以最佳方式排列步驟並選擇連接類型的查詢優化器可能會讓您感到厭煩。 使用 MongoDB,您可以以犧牲便利性為代價獲得更多控制權。

類似的工具 工作室3T 將簡化聚合查詢的建構 MongoDB的。 聚合編輯器功能可讓您一次應用一個階段的管道語句,並檢查每個階段的輸入和輸出資料以簡化偵錯。

使用快速錄音

切勿將 MongoDB 寫入選項設定為具有高速度但低可靠性。 這種模式 “一勞永逸” 看起來很快,因為命令在寫入發生之前返回。 如果系統在資料寫入磁碟之前崩潰,資料將會遺失並最終處於不一致的狀態。 幸運的是,64 位元 MongoDB 啟用了日誌記錄。

MMAPv1 和 WiredTiger 儲存引擎使用日誌記錄來防止這種情況,儘管 WiredTiger 可以恢復到最後一致的狀態 控制點,如果禁用日誌記錄。

日記可確保資料庫在復原後處於一致狀態,並保留所有資料直到將其寫入日記。 記錄的頻率使用參數配置 commitIntervalMs.

為了確保條目的正確性,請確保在設定檔中啟用了日誌記錄 (storage.journal.enabled),記錄的頻率對應於您可以承受遺失的資訊量。

無索引排序

在搜尋和聚合時,經常需要對資料進行排序。 我們希望這是在過濾結果之後的最後階段之一完成的,以減少排序的資料量。 即使在這種情況下,為了排序你也需要 指數。 您可以使用單一索引或複合索引。

如果沒有合適的索引,MongoDB 就不用它了。 所有文件的總大小的記憶體限制為 32 MB 排序操作,如果 MongoDB 達到這個限制,那麼它要么拋出錯誤,要么返回 空記錄集.

不支援索引的搜尋

搜尋查詢執行的功能類似於 SQL 中的 JOIN 操作。 為了最好地工作,他們需要用作外鍵的鍵值的索引。 這並不明顯,因為使用沒有體現在 explain()。 這些索引是除了寫入的索引之外的 explain(),依序由管道操作員使用 $match и $sort,當它們在管道的開頭相遇時。 索引現在可以覆蓋任何階段 聚合管道.

選擇不使用多重更新

方法 db.collection.update() 用於更改現有文件的一部分或整個文檔,直至完全替換,具體取決於您指定的參數 update。 不太明顯的是,除非您設定選項,否則它不會處理集合中的所有文檔 multi 更新所有符合請求標準的文件。

不要忘記哈希表中鍵的順序的重要性

在 JSON 中,物件由大小為零或多個名稱/值對的無序集合組成,其中名稱是字串,值是字串、數字、布林值、null、物件或陣列。

不幸的是,BSON 在搜尋時非常強調順序。 在 MongoDB 中,內建物件中鍵的順序 事項{ firstname: "Phil", surname: "factor" } - 這與 { { surname: "factor", firstname: "Phil" }。 也就是說,如果您想確保找到名稱/值對,則必須在文件中儲存它們的順序。

不要混淆 “空值” и “不明確的”

“不明確的” 根據,在 JSON 中從來都不是有效的 官方標準 JSON(ECMA-404 第 5 節),即使它在 JavaScript 中使用。 此外,對於 BSON 來說它已經過時並被轉換為 $null,這並不總是一個好的解決方案。 避免使用 “不明確的” 在 MongoDB 中.

使用 $limit() 沒有 $sort()

通常,當您在 MongoDB 中進行開發時,僅查看查詢或聚合傳回的結果範例會很有用。 對於此任務,您將需要 $limit(),但它永遠不應該出現在最終程式碼中,除非您之前使用過它 $sort。 這種機制是必要的,因為否則您將無法保證結果的順序,並且您將無法可靠地查看資料。 在結果的頂部,根據排序,您將獲得不同的條目。 為了可靠地工作,查詢和聚合必須是確定性的,即每次執行時都會產生相同的結果。 程式碼包含 $limit(), 但不是 $sort,不會是確定性的,並且可能隨後導致難以追蹤的錯誤。

結論

對 MongoDB 感到失望的唯一方法是將其直接與另一種類型的資料庫(例如 DBMS)進行比較,或基於某些期望來使用它。 這就像將橙子與叉子進行比較一樣。 資料庫系統服務於特定目的。 最好自己簡單地理解和欣賞這些差異。 如果向 MongoDB 開發人員施加壓力,迫使他們走上 DBMS 的道路,那將是一種恥辱。 我希望看到新的、有趣的方法來解決舊問題,例如確保資料完整性和創建能夠抵禦故障和惡意攻擊的資料系統。

MongoDB 在 4.0 版本中引入 ACID 事務性是以創新方式引入重要改進的一個很好的例子。 多文檔和多語句事務現在是原子的。 還可以調整取得鎖定和終止卡住交易所需的時間,以及更改隔離等級。

在開始使用 MongoDB 之前我希望知道的 14 件事

閱讀更多:

來源: www.habr.com

添加評論